n皇后(c/c++实现)
这次n皇后写是写出来了用的一维数组,不过一些地方还欠考虑,导致程序运行不起来,得高人指点才实现。程序本质是递归的略深的应用,属于递归经典类题目。
程序实现是假定在前k-1行摆好皇后的基础上再去摆第k行的皇后,需要注意的是 要遍历前k-1行的元素,遍历完成保证与第k行预摆的位置不冲突。找到合适的摆放位置。
如果找不到合适的摆放位置,则要调到上一步,重新进行下一种策略。
本题犯的错误就是没有吧k==0的时候考虑在内,导致第二层for不执行,导致程序始终进入不了NQueen(1); 修改后正常运行
下面是错误代码及修正代码:
#include"bits/stdc++.h"
using namespace std;
int N; //N手动输入,确定为N皇后
int queenPos[100];//数组下标表示行,元素表示该行的皇后摆在哪一列
void NQueen(int k){//递归函数
if(k==N){//递归出口;第N个皇后已经摆好啦,代表所有皇后都已经摆好了
for(int i=0;i<N;i++){ //
cout<<queenPos[i]+1<<" ";
}
cout<<endl;
return;
}
else{
for(int i=0;i<N;i++){//遍历第k行的每个列元素
for(int j=0;j<k;j++){//遍历已经摆好的前k-1行的所有列 看是否与要摆放的位置i冲突
if(queenPos[j]==i||abs(queenPos[j]-i)==abs(j-k)){
break;//冲突;跳出循环
}
if(j==k-1){
queenPos[k]=i;
NQueen(k+1);
}
}
}
}
}
int main()
{
cin>>N;
NQueen(0);
return 0;
}
//正确示例:
#include"bits/stdc++.h"
using namespace std;
int N; //N手动输入,确定为N皇后
int queenPos[100];//数组下标表示行,元素表示该行的皇后摆在哪一列
void NQueen(int k){//递归函数
if(k==N){//递归出口;第N个皇后已经摆好啦,代表所有皇后都已经摆好了
for(int i=0;i<N;i++){ //
cout<<queenPos[i]+1<<" ";
}
cout<<endl;
return;
}
else{
for(int i=0;i<N;i++){//遍历第k行的每个列元素
bool flag=true;
for(int j=0;j<k && flag;j++){//遍历已经摆好的前k-1行的所有列 看是否与要摆放的位置i冲突
if(queenPos[j]==i||abs(queenPos[j]-i)==abs(j-k)){
flag=false;
break;//冲突;跳出循环
}
}
if(flag){
queenPos[k]=i;
NQueen(k+1);
}
}
}
}
int main()
{
cin>>N;
NQueen(0);
return 0;
}