« ご当地ライダー。 | トップページ | 天才の言葉。 »

2005年6月16日 (木)

解き始め。

盤面も動くようになったので、全部を解くまでは行かないまでも、人間のクリックにアシストをするようにする。

最初っから全部を解かせようとしないのが得策。
これは入出力が簡単に処理できるようになってから、割と普遍的に自分の戦略。

真っ先に効果が得られるのが局地的なパターンで決まる部分である。
『ひとりにしてくれ』なら同じ数字が3つ並んでいるとき=黒白黒、
同じ数字がひとつ飛んで並んでいる場合=未白未、
同じ数字2つ並びのほかに同じ数字がある場合=未未&黒、
が真っ先に実装できそうだ。

盤全体をサーチするので、単純にBrainにこのPatternをサーチさせるのが楽だろう。
サーチのきっかけは余っているクリック、つまり枠の外をクリックしたときにしておく。
これはいくら入出力処理が楽になったとはいえ、それでも余計なボタンとかメニューを作るのを避けるときによく取る作戦。

サーチの条件を作っているうちにこの3つは互いに似通っている部分があることに気づく。
最初の2つは真ん中が白、そして『ひとりにしてくれ』なので、ひとつが白なら残りは黒。
3つめは隣り合ったどちらかが白なので残りは黒。

ということで、サーチの条件を
『同じ数字の隣り合わせ』と
『同じ数字の一個おき』に絞り、助っ人として
『数字がひとつ白になったら(候補が2つ以下になったら)残りは黒』を縦横作ることにする。

助っ人メソッド
private void colClear(int x, int num, int y1, int y2){}
列xの中の数字numについて、y1とy2以外のものを塗りつぶす。
private void rowClear(int(int y, int num, int x1, int x2){}
仕組みは同じ。

この助っ人たち、emptyから呼び出せば効率よく縦横をクリアできる。
    private void empty(int x, int y) {
        this.cells[x][y].state = HitoriBrain.EMPTY;
        this.rowClear(y, this.cells[x][y].num, x, x);
        this.colClear(x, this.cells[x][y].num, y, y);
    }

ここでx1とx2、y1とy2に同じ数字を渡すことで残り1個のときも残り2個のときも同じメソッドで処理できるようにしたのがミソ。

こういう単純な発想のたびに『自分は天才かも』と思えるところがプログラミングにはまっていく理由。

天才は自分のこと天才だとは思ってないだろうな、たぶん。

|

« ご当地ライダー。 | トップページ | 天才の言葉。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/109403/4580524

この記事へのトラックバック一覧です: 解き始め。:

« ご当地ライダー。 | トップページ | 天才の言葉。 »