0

1Dアレイを使用し、ブルートフォースを使用するように8クイーンプログラムを変更する割り当てが与えられました(すでにバックトラックを実行しました)。私は次のコードを思いついた:

#include <cmath>
#include <iostream>
using namespace std;

bool ok(int board[8]){

for(int j = 0; j <= 7; j++){ //check for repeating digits
    cout << "ok loop 1"<<endl;
    for (int k = 0; k <= 7; k++)
    {
        cout << "ok loop 2"<<endl;
        if (board[k] = board[j]){ return false; }
    }
}

for(int c = 7; c >= 0; c--){ //check if position is safe
    cout << "ok loop 3"<<endl;
    //int r = 0;

    for(int i = 1; i <= c; i++){
    cout << "ok loop 4"<<endl;
        if(board[c-i] == c)
            return false;
        else if ((board[c]-i)>0 && board[c-i]-i == 1)

            return false;
        else if ((board[c]+i)<=7 && board[c-i]+i == 1)
            return false;
    } // for loop

} // for loop
    return true;
} // ok




void print(int board[8], int c){
cout << "Solution " << c << ": " << endl;
for(int i = 0; i < 8; i++){
{
    cout << board[i] <<" ";
} 
}

cout << endl;
} 




int main ()
{

int b[8]={0}; //initialize the array
int count = 0;

for(b[0]=0; b[0]<8; b[0]++)
for(b[1]=0; b[1]<8; b[1]++)
    for(b[2]=0; b[2]<8; b[2]++)
        for(b[3]=0 ; b[3]<8; b[3]++)
            for(b[4]=0; b[4]<8; b[4]++)
                for(b[5]=0; b[5]<8; b[5]++)
                    for(b[6]=0; b[6]<8; b[6]++)
                        for(b[7]=0; b[7]<8; b[7]++)
                            if(ok(b)) 
                            {
                                count++;
                                print(b, count);
                            }
system("PAUSE");
return 0;
}

それは永遠にループし続けます、そして私は理由がわかりません。誰かが私を助けてくれませんか?

4

1 に答える 1

1

改善できる点がいくつかあります。

  • const 以外の int へのポインターではなく、8 文字の定数配列への参照を渡した場合ok()、コンパイラーは問題の 1 つについて通知することができたはずです。
  • クイーンはいくつの異なるポジションを持つことができますか? あなたのコードは8を示唆していますが、私は64と言います。あなた自身が混乱しているように見えるので、コード全体で変数と定数の実際の意味を文書化することから始めます。
  • board[x] が board[y] であるかどうかをチェックしますが、x と y が等しいことから、数字の繰り返しがあると主張します。
  • あなたはさまざまな女王の間で違いを生みます。つまり、プログラムは、クイーンが同じ 8 つの位置にどのように配置されるかのすべての順列を見つけます。これは間違いではありませんが、非効率的です。ポジションの数を固定すると、顕著な違いが生じます。
于 2013-03-02T08:22:45.590 に答える