八皇后问题 DFS,回溯剪枝 //http://poj.grids.cn/practice/2698

就是DFS,一出现同行,同列或同对角线,就不往下搜了,就叫剪枝,然后一到出现一个可行解,输出来。记得再递归调用回退的时候要“恢复现场”

贴代码:

View Code
 1 //http://poj.grids.cn/practice/2698
 2 #include <cstdio>
 3 #include <cstring>
 4 bool a[10][10];
 5 int cur=0;
 6 //开始考虑放第i行
 7 void DFS(int i)
 8 {
 9     int j,k;
10     if(i == 8)//得到一个可行解
11     {
12         printf("No. %d\n",++cur);
13         for(j=0; j<8; ++j)
14         {
15             for(k=0; k<8; ++k)
16             {
17                 if(k!=0) printf(" ");
18                 printf("%d",a[k][j]);
19             }
20             puts("");
21         }
22         return ;
23     }
24     for(j=0; j<8; ++j)
25     {
26         bool flag = true;//判断这样放是否可行
27         for(k=0; k<i &&flag; ++k)
28         {
29             for(int t=0; t<8; ++t)
30             {
31                 if(a[k][t] && (t == j|| t-j == k-i || t-j == i-k))
32                 {
33                     flag = false;
34                     break;
35                 }
36             }
37         }
38         if(flag)//可行,就这样放
39         {
40             a[i][j] = 1;
41             DFS(i+1);
42             a[i][j] =0;//回退了的时候恢复现场
43         }
44     }
45 }
46 int main()
47 {
48     memset(a,0,sizeof(a));
49     DFS(0);
50     return 0;
51 }

 

posted on 2013-04-12 00:36  allh123  阅读(468)  评论(0编辑  收藏  举报

导航