搜索练习题八皇后问题


 

题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1213


 

题目描述:

  在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。

【输入】

(无)

【输出】

按给定顺序和格式输出所有八皇后问题的解(见样例)。

【输入样例】

(无)

【输出样例】

No. 1
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 1 0 0 0 0 0 
No. 2
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 1 0 0 0 0 0 
...以下省略
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int ans[9],sum;                //// ans[i]用于记录第i行皇后列号,sum用于记录方案数
 4 bool isp(int x1,int y1,int x2,int y2){
 5     return x1==x2||y1==y2||abs(x1-x2)==abs(y1-y2);            // 返回true:会互相攻击到;返回false:不会互相攻击到
 6 }
 7 void prin(){
 8     sum++;
 9     cout<<"No."<<sum<<endl;
10     for(int i=1;i<=8;i++){
11         for(int j=1;j<=8;j++){
12             cout << (j > 1 ? " " : "") << (j == ans[i]);
13         }            
14         cout<<endl;
15     }        
16 }
17 void dfs(int id){
18     if(id>8){
19         prin();                                // 说明前8行已经放好了
20         return ;
21     }
22     for(int i=1;i<=8;i++){                    // 尝试在第id行第i列放皇后
23         bool flag=true;                        // flag用于标识是否能放
24         for(int j=1;j<id;j++){    
25             if(isp(id,i,j,ans[j])){            // (id,i)和(j,ans[j])冲突
26                 flag=false;
27                 break;
28             }
29         }
30         if(flag){                            // 如果循环结束flag仍为true说明i能放
31             ans[id] = i;                    // 能放就先放上
32             dfs(id+1);                        // 然后递归进行下一行的放置
33         }        
34     }
35 }
36 int main(){
37     dfs(1);                                    // 从第1行开始放            
38     return 0;
39 }

 


 

posted on 2020-02-26 16:52  恒晨  阅读(225)  评论(0编辑  收藏  举报

导航