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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM