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