Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用蛮力解8皇后1D阵?_C++_Loops_While Loop_N Queens - Fatal编程技术网

C++ 如何用蛮力解8皇后1D阵?

C++ 如何用蛮力解8皇后1D阵?,c++,loops,while-loop,n-queens,C++,Loops,While Loop,N Queens,我被指派修改一个8皇后程序,使用1D数组和蛮力(已经做了回溯)。我想出了以下代码: #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 (

我被指派修改一个8皇后程序,使用1D数组和蛮力(已经做了回溯)。我想出了以下代码:

#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;
}
#包括
#包括
使用名称空间std;
bool ok(集成电路板[8]){

对于(int j=0;j有几点可以改进:

  • 如果您将对八个字符的常量数组的引用传递给
    ok()
    ,而不仅仅是指向非常量int的指针,编译器可能会告诉您其中一个问题
  • 一个女王可以有多少个不同的位置?我会说64个,虽然你的代码建议有8个。我会从记录整个代码中变量和常量的实际含义开始,因为你自己似乎对此感到困惑
  • 检查线路板[x]是否为线路板[y],但x和y相等,并由此声明存在重复数字
  • 您可以在不同的皇后之间进行区分。换句话说,您的程序将找到皇后如何定位在相同的八个位置上的所有排列。这不是错误的,而是低效的。如果您固定位置的数量,这将产生显著的区别

你问过调试器这个问题吗?我注意到:如果(board[k]=board[j]){return false;}我不确定你在问什么,对不起。@Andy T那么我的推理是,如果两个索引具有相同的数字,那么这意味着它们位于同一行,那么函数将返回false。我使用了几个1D数组;-)@蔡斯:我想你错过了安迪评论的要点,很可能你想要的是
if(board[k]==board[j])
而不是
if(board[k]=board[j])
,因为第二个表达式的值是指定的值。我已经解决了我的问题。你介意看看我的新问题吗?