1213:八皇后问题

八皇后问题

首先可以试图去简化问题,将问题转化为为每一列确定一个有效的行号

因为同一列只能有一个皇后,并且需要在八列中确定八个皇后,即每一列都必定有且只有一个皇后

经过简化后,显然,通过一个一维数组即可以确定一组有效解

关于check:

  • 不为同一行或同一列的判定比较简单(这里省略)
  • (i1,j1)与(i2,j2)在同一条斜线上的判定:i1-i2==j1-j2 || i1-i2==j2-j1

问题经过这样一次抽丝剥茧后,剩余的思路大致就是深度搜索、临界输出

特别重复:a[j]表示第j列的皇后所在的行数

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int N=10;
 6 int ans,a[N];
 7 void print(){
 8     printf("No. %d\n",++ans);
 9     for(int i=1;i<=8;i++){
10         for(int j=1;j<=8;j++)
11             if(a[j]==i)printf("1 ");
12             else printf("0 ");
13         printf("\n");
14     }
15 }
16 bool check(int x,int d){
17     for(int i=1;i<d;i++){
18         if(a[i]==x||x-a[i]==d-i||x-a[i]==i-d)
19             return 0;
20     }
21     return 1;
22 }
23 void solve(int d){
24     if(d==9){
25         print();
26         return;
27     }
28     for(int i=1;i<=8;i++){
29         if(check(i,d)){
30             a[d]=i;
31             solve(d+1);
32         }
33     }
34 }
35 int main(){
36     solve(1);
37     return 0;
38 }

 

posted @ 2021-08-05 17:16  Rekord  阅读(1045)  评论(0编辑  收藏  举报