99+木头的博客&
Enjoy writing code.

[题解]N 皇后问题总结

N 皇后问题(queen.cpp)

[题目描述]

在 N*N 的棋盘上放置 N 个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置 2 个皇后) ,编程求解所有的摆放方法。

 

 

 

 

 

 

 

 

 

 

 

[输入格式]

输入:n

    

[输出格式]

每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方案,则输出no solute!

    

[输入样例]

4

    

[输出样例]

2 4 1 3

3 1 4 2

    

[解法]

看题直接DFS即可.主要DFS方法是把每一行看作一个盒子,每层DFS只考虑当前盒子(即当前行)的皇后摆.当把n行每行的皇后位置确定后也就找到了一种方法. 下面是最重要的代码段:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

判断是否与之前的皇后攻击,因为是把每一行看作一个盒子所以不需要考虑行的皇后攻击.

    

[代码(AC)]

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <string>
 5 #include <cstring>
 6 #include <algorithm>
 7 using namespace std;
 8 int queen[100];
 9 int num;//num行
10 bool flag=false;//判断是否有解标记
11 void n_queen(int n){
12         if(n>num){
13             flag=true;//有解,更新标记
14             for(int i=1;i<=num;++i){//输出解
15                 printf("%d ",queen[i]);
16             }
17             printf("\n");
18         }
19         else {
20             for(int i=1;i<=num;++i){
21                 bool k=true;
22                 for(int j=1;j<n;++j){
23                     if(n-j==i-queen[j]||i==queen[j]||n+i==queen[j]+j){//'\'斜||同一列||'/'斜
24                         k=false;
25                         break;
26                     }
27                 }
28                 if(k){
29                     queen[n]=i;//摆好这一行
30                     n_queen(n+1);//准备放下一行
31                 }
32             }
33         }
34 }
35 int main(){
36         //freopen("queen.in","r",stdin);
37         //freopen("queen.out","w",stdout);
38         memset(queen,false,sizeof(queen));
39         scanf("%d",&num);
40         n_queen(1);//从第一行放
41         if(flag==false)printf("no solute!");
42         return 0;
43 }

2018-10-05 22:20:16
posted @ 2018-10-05 22:11  99+木头  阅读(2012)  评论(2编辑  收藏  举报