0

私はNクイーンの問題に対する「ばかげた」解決策を見ていますが、コードにあるwhileループに混乱しています。

bool check(int b[8][8])
{

  for(int c = 7; c >= 0; c--)
  {
    int r = 0;
    while(b[r][c] != 1 ) //this is the while loop I was talking about
   {
    r++;
   } //end while loop

    for(int i = 1; i <= c; i++)
   {
    if(b[r][c-i] == 1)
        return false;
    else if ((r-i)>=0 && b[r-i][c-i] == 1)

        return false;
    else if ((r+i)<=7 && b[r+i][c-i] == 1)
        return false;
    }

  } 
return true;
} 

int main()には8つのforループがあり、最も内側のループでは、ボードの最初の行全体を1に初期化します。次に関数を呼び出し、関数を呼び出した後、最初の行全体をゼロにリセットします。必要に応じて、intmainを表示できます。

4

2 に答える 2

3

コードをインデントすると便利です。

-loopはwhile-loop内にありますfor。値がない正方形()が見つかるまでr、現在の列()の行()をスキャンしています(つまり、空の正方形であることを意味します)。cb[r][c]1

これを読むことができないという事実は、わかりやすい名前の識別子の重要性と、コードで「マジックナンバー」を使用しないことの重要性を浮き彫りにします。

読むことをお勧めします:Brian W.KernighanとRobPikeによるプログラミング作法(プロフェッショナルコンピューティング)

于 2013-02-13T01:20:19.223 に答える
1

アウターforはデクリメントしていますc。値cは配列要素のインデックスです。はWhile-loop、2次元配列のヘッド要素を反復処理しています。の配列要素[r][c]が1に等しくない限り、チェックを続行します。で境界チェックが表示されませんr

于 2013-02-13T01:21:27.700 に答える