Live2D

八皇后问题

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

judge

分析:经典的深搜题目,难点在于,如何标记两个对角线已经被占领。

仔细观察棋盘我们发现,从左下到右上的那条斜线横纵坐标之和都相等,所以可以利用这个性质标记一条对角线

另一条对角线横纵坐标之差都相等,为了防止数组越界我们+8来标记另一条

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int g[10][10];
 9 bool line[10],xie1[20],xie2[20];
10 int ans;
11 
12 inline void dfs(int pos)
13 {
14     for(int i=1;i<=8;i++)
15     {
16         if(!line[i]&&!xie1[i+pos]&&!xie2[pos-i+7])
17         {
18             g[i][pos]=1;
19             line[i]=true;
20             xie1[i+pos]=true;
21             xie2[pos-i+7]=true;
22             if(pos==8)
23             {
24                 ans++;
25                 printf("No. %d\n",ans);
26                 for(int j=1;j<=8;j++)
27                 {
28                     for(int k=1;k<=8;k++)
29                         printf("%d ",g[j][k]);
30                     printf("\n");
31                 }
32             }
33             else dfs(pos+1);
34             g[i][pos]=0;
35             line[i]=false;
36             xie1[i+pos]=false;
37             xie2[pos-i+7]=false;
38         }
39     }
40 }
41 
42 int main()
43 {
44     dfs(1);
45     return 0;
46 }
八皇后

八皇后2

judge

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int a[100][10],b[10];
 9 bool line[10],xie1[20],xie2[20];
10 int ans;
11 
12 inline void dfs(int pos)
13 {
14     for(int i=1;i<=8;i++)
15     {
16         if(!line[i]&&!xie1[i+pos]&&!xie2[pos-i+7])
17         {
18             b[pos]=i;
19             line[i]=true;
20             xie1[i+pos]=true;
21             xie2[pos-i+7]=true;
22             if(pos==8)
23             {
24                 ans++;
25                 for(int j=1;j<=8;j++)
26                     a[ans][j]=b[j];
27             }
28             else dfs(pos+1);
29             b[pos]=0;
30             line[i]=false;
31             xie1[i+pos]=false;
32             xie2[pos-i+7]=false;
33         }
34     }
35 }
36 
37 int main()
38 {
39     dfs(1);
40     int n;
41     scanf("%d",&n);
42     for(int i=1;i<=n;i++)
43     {
44         int q;
45         scanf("%d",&q);
46         for(int j=1;j<=8;j++)
47             printf("%d",a[q][j]);
48         printf("\n");
49     }
50     return 0;
51 }
View Code

 

posted @ 2019-08-16 15:45  Hoyoak  阅读(276)  评论(0编辑  收藏  举报