#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;
}
这个递归逻辑错误在哪里?
也许是你使用过多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