[题解]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