不要让昨天 占据你的今天 夏午晴天

夏午晴天

八皇后问题(dfs)

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 int num = 1;
 5 bool a[8], b[16], c[16], vis[8][8];
 6 //a, b, c 数组标记 列 和 斜线
 7 //正斜线上位置 x 和 y 相加为一个常数且每个斜线都不相等
 8 //反斜线上位置 x 和 y 相减为一个常数且每个斜线都不相等
 9 //所以可以用这个规律来标记每个斜线上是否有皇后
10 
11 void read(){
12     cout<<num++<<" *************"<<endl;
13     for(int i = 0; i < 8; ++i){
14         for(int j = 0; j < 8; ++j){
15             if(vis[i][j]) printf("Q ");
16             else printf(". ");
17         }
18         printf("\n");
19     }
20 }
21 
22 void dfs(int x){  //x 为行号
23         if(x == 8){
24         read();
25         return ;
26     }
27     for(int i = 0; i < 8; ++i){
28         if(a[i] || b[x+i] || c[x-i+8]) continue;
29         a[i] = b[x+i] = c[x-i+8] = vis[x][i] = true;
30         dfs(x+1);
31         a[i] = b[x+i] = c[x-i+8] = vis[x][i] = false;//一定在搜索下一行前把标记的复原
32     }
33 }
34 
35 int main(){
36     dfs(0);
37     return 0;
38 }

 

posted on 2017-04-17 22:45  夏晴天  阅读(190)  评论(0编辑  收藏  举报

导航

Live2D