-2

1D クイーンズ問題で、特定の for ループを完了まで続けようとして問題が発生しています。

まず、すべてに goto ステートメントを使用しました。現在、代わりに関数を使用して goto ステートメントを取り除こうとしています。最終的にはすべて削除しますが、NR (新しい行) とバックトラックに注目しています。

私が問題を抱えている for ループは、位置がクイーンにとって安全かどうかをチェックするループです。コメントで完了しない for ループを指摘します。

//forward declarations
int backtrack (int board[], int& c_position);

//NR: q[c]++;
//if (q[c]==8) goto backtrack;

void NR (int board[], int& c_position) //new row
{
    board[c_position]++;
    if (board[c_position]==8) {backtrack(board, c_position);}
}

int backtrack (int board[], int& c_position)  // backtrack
{
    c_position--;
    if (c_position==-1) {system("PAUSE"); exit(1);}
    NR(board, c_position);
}


int main ()
{

int q[8] = {0};  //1D array, the board, all set to 0;
int c=0;
int count=0;


NC: c++; //new column
    if (c==8) goto print;
    q[c]=-1;

NR(q, c);


    //test to see if position is safe
    for (int i=0; i<c; i++) //this is the for loop I am having trouble with
    {
    if ( (q[i]==q[c]) || ((c-i)==abs(q[c]-q[i])) ) { NR(q, c); }
    }

    goto NC;

print: //printing the 1D board gives us a single line, where each number represents a row where a queen is
        count++;
        cout << count << endl;
      for(int j = 0; j <= 7; j++)
      {
         cout << q[j] << " ";
      }
       cout << endl;
        backtrack(q, c);

        system("PAUSE"); return 0;

}
4

1 に答える 1

1

cデクリメントする別の関数に渡す関数に参照渡ししています。

これは、(outergotoベースの) ループがインクリメントしようとする試みを阻止するように見えます。

とにかく、それは私がもっと注意深く見たいものです。

于 2013-02-19T14:39:56.083 に答える