Cパズルプログラミング-再帰編 > ペントミノ > 置けるか確認してみよう


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

置けるか確認してみよう 応援する 

さて、ピースを置くときに、盤面からはみ出すのも無視していたが、座標を与えたとき、それが盤面の内部かどうかを判定する関数 ison() を作ってみた。

        int     ison( int x, int y )
        {
                if( x<0 || x>=WIDTH )
                        return  FALSE;
                if( y<0 || y>=HEIGHT )
                        return  FALSE;
                return  TRUE;
        }

ピースを置く前に、ピースが置けるか否かを確認する必要が有るので、そのための関数 ispieceok() というのを作ってみた。もちろん、今回も、 pieceset()をコピーして作ったことは言うまでもない。横着はプログラマに必須である。

        int     ispieceok( int x, int y, PieceForm *pf )
        {
                int     i;
                int     u, v;

                for( i=0; i<CN; ++i ) {
                        u = x + pf->form[i].x;
                        v = y + pf->form[i].y;
                        if( ! ison(u,v) )
                                return  FALSE;
                        if( board[u][v] != BLANK )
                                return  FALSE;
                }
                return  TRUE;
        }

置けるかどうかの検査が、まず盤面に収まっているかを判定し、5つのセルのうち1つでもダメな場合にはさっさとダメ(FALSE)を返している。盤上の場合には、さらに、そのセルにピースが置ける状態(ブランク)であるかの判定をしている。

今回は、検査のため、ちょっとmain() が凝っているかな。最初にピースを2個(X,P)置いてから、ピースFが置ける場所をすべてリストアップするようにしてみた。

        int     main(int argc, char **argv)
        {
                int     x, y;
                PieceForm  pf = { 'F', {{ 0, 0},{ 0, 1},{ 1, 1},{ 1, 2},{ 2, 1}} };
                PieceForm  px = { 'X', {{ 0, 0},{ 1,-1},{ 1, 0},{ 1, 1},{ 2, 0}} };
                PieceForm  pp = { 'P', {{ 0, 0},{ 0, 1},{ 0, 2},{ 1, 0},{ 1, 1}} };

                initboard();
                pieceset( 2, 2, &px );
                pieceset( 6, 2, &pp );

                printboard();

                for( x=0; x<WIDTH; ++x ) {
                  for( y=0; y<HEIGHT; ++y ) {
                        if( ispieceok( x, y, &pf ) ) {
                                pieceset( x, y, &pf );
                                printboard();
                                pieceunset( x, y, &pf );
                        }
                  }
                }
        }

以上をとりあえずまとめたのが pentomino7.c である。

                $ pentomino
                 . . . . . . . . . .
                 . . . X . . . . . .
                 . . X X X . P P . .
                 . . . X . . P P . .
                 . . . . . . P . . .
                 . . . . . . . . . .

                 F . . . . . . . . .
                 F F F X . . . . . .
                 . F X X X . P P . .
                 . . . X . . P P . .
                 . . . . . . P . . .
                 . . . . . . . . . .

                 . . . . . . . . . .
                 . . . X . . . . . .
                 F . X X X . P P . .
                 F F F X . . P P . .
                 . F . . . . P . . .
                 . . . . . . . . . .

                 . . . . . . . . . .
                 . . . X . . . . . .
                 . . X X X . P P . .
                 F . . X . . P P . .
                 F F F . . . P . . .
                 . F . . . . . . . .

                 . . . . . . . . . .
                 . . . X . . . . . .
                 . . X X X . P P . .
                 . F . X . . P P . .
                 . F F F . . P . . .
                 . . F . . . . . . .

                 . . . . . . . . . .
                 . . . X . . . . . .
                 . . X X X . P P . .
                 . . F X . . P P . .
                 . . F F F . P . . .
                 . . . F . . . . . .

                 . . . . F . . . . .
                 . . . X F F F . . .
                 . . X X X F P P . .
                 . . . X . . P P . .
                 . . . . . . P . . .
                 . . . . . . . . . .

                 . . . . . . . F . .
                 . . . X . . . F F F
                 . . X X X . P P F .
                 . . . X . . P P . .
                 . . . . . . P . . .
                 . . . . . . . . . .

                $

確認は面倒だったので省略したが、たぶん合っているだろう。

2001年11月3日


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

Subtitles


このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation