n皇后(c/c++实现)

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41634258/article/details/86439681