写了一个求解八皇后问题的问题代码


#include <iostream>
#include <cstring>

using namespace std;

int queen( int col[9],int start){    //数组的下标代表列,col[i]的值代表在该列放的皇后所在的行数.
    if(start == 9){
            for(int j = 1; j <9; j++)cout << col[j] ;
            cout << endl;
            return 0;//假如正常进行到第八列, 就输出数组;
        }
    for(int i =start; i <9; i ++){
        for(int k = 1; k <9; k++){
            bool flag = true;
            col[i] = k;//给第i列的第k行放上皇后;
            for(int j = 1; j < 9;j++){
                if (i == j || col[j] == 0) continue;//不与同一个格子、没有放皇后的格子;进行比较
                if(col[j] == col[i]|| i+col[i] == j + col[j] || i- col[i] == j-col[j]) {//检测是否有同行、同对角线的皇后
                        flag = false;col[i] = 0;break;/*如果有问题,flag输出false,跳出循环
                                                        如果没有,flag为true;尝试在下一列放置皇后*/
                    }
                }
            if(flag){
                if(!col[i]) return 0;//如果flag为true,而且在该列放置了皇后,就继续对下一列进行放置操作;如果未放置,说明此时无解,跳出本层递归;
                queen(col,start+1);
            }
        }
    }
}


int main(){
 int queens[9] = {0};

 queen(queens,1);
}

以上,输出了很多很多个数字..

主要的问题是你已经用递归了,那么for(int i=start;i<9;i++)这个循环就不需要了,递归本身就相当于这个循环
把这层循环去掉,同时把i都改为start

#include <iostream>
#include <cstring>
using namespace std;
int queen( int col[9],int start){    //数组的下标代表列,col[i]的值代表在该列放的皇后所在的行数.
    if(start == 9){
            for(int j = 1; j <9; j++)cout << col[j] ;
            cout << endl;
            return 0;//假如正常进行到第八列, 就输出数组;
        }
 //   for(int i =start; i <9; i ++){
        for(int k = 1; k <9; k++){
            bool flag = true;
            col[start] = k;//给第i列的第k行放上皇后;
            for(int j = 1; j < 9;j++){
                if (start == j || col[j] == 0) continue;//不与同一个格子、没有放皇后的格子;进行比较
                if(col[j] == col[start]|| start+col[start] == j + col[j] || start- col[start] == j-col[j]) {//检测是否有同行、同对角线的皇后
                        flag = false;col[start] = 0;break;/*如果有问题,flag输出false,跳出循环
                                                        如果没有,flag为true;尝试在下一列放置皇后*/
                    }
                }
            if(flag){
                if(!col[start]) return 0;//如果flag为true,而且在该列放置了皇后,就继续对下一列进行放置操作;如果未放置,说明此时无解,跳出本层递归;
                queen(col,start+1);
            }
 //       }
    }
}
 
int main(){
 int queens[9] = {0};
 queen(queens,1);
return 0;
}

img

这个递归逻辑错误在哪里?

也许是你使用过多for所导致的吧,使用递归求解你可以参考这个代码

#include <iostream>
using namespace std;
//递归算法解决八皇后问题。总共有92种解法。
int c[20], n=8, cnt=0;
void print(){

    for(int i=0; i<n; ++i){
        for(int j=0; j<n; ++j){
            if(j == c[i]) cout<<"1 ";
            else cout<<"0 ";
        }
        cout<<endl;
    }
    cout<<endl;
}
void search(int r){
    if(r == n){
        print();
        ++cnt;
        return;
    }
    for(int i=0; i<n; ++i){
        c[r] = i;
        int ok = 1;
        for(int j=0; j<r; ++j)
            if(c[r]==c[j] || r-j==c[r]-c[j] || r-j==c[j]-c[r]){
                ok = 0;
                break;
            }
        if(ok) search(r+1);
    }
}
int main(){
    search(0);
    cout<<cnt<<endl;
    return 0;
}

或者参考我的这个文章
https://blog.csdn.net/huayula/article/details/106338548