N皇后问题

N皇后问题

搜索回溯最经典的例题,仍然是没有之一

原题

3、N皇后问题(queen.cpp)
【问题描述】
在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
【输入格式】
输入:n
【输出格式】
每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方案,则输出no solute!
【输入样例】
4
【输出样例】
2 4 1 3
3 1 4 2

算法分析

递归安排第n个皇后的位置,用记录bool数组来记录该点是否可以摆放皇后
对角线另开两个,存储位置使用特殊算法(这个可以自行发挥)来解决

标程

#include
#include
using namespace std;
int n,cnt,flag;
int s[20];
bool vis1[20],vis2[20],vis3[30];
void dfs(int dep){
    int i;
    if(dep==n+1){
        cnt++;
        if(flag<3){
        for(i=1;i<=n;i++){
          cout<" ";
        }
        cout<else {
        for(i=1;i<=n;i++){
            if(!vis1[i]&&!vis2[dep-i+n]&&!vis3[dep+i]){
                s[dep]=i;
                vis1[i]=vis2[dep-i+n]=vis3[dep+i]=true;
                dfs(dep+1);
                vis1[i]=vis2[dep-i+n]=vis3[dep+i]=false;
            }
        }
    }
}
int main(){
    freopen("queen.in","r",stdin);
    freopen("queen.out","w",stdout); 
    cin>>n;
    dfs(1);
    //cout<
    fclose(stdin);
    fclose(stdout);
    return 0;
}

你可能感兴趣的:(搜索与回溯,搜索)