码迷,mamicode.com
首页 > 其他好文 > 详细

N皇后问题--递归回溯

时间:2014-11-01 11:26:55      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   for   sp   div   on   问题   

著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一行放的位置错误, 所以回溯到上一行中,继续找下一列,如果找不到,继续回溯,大体就是这么执行找到解的。

下面是代码:

 1 #include <stdio.h>
 2 
 3 const int MAX = 30;
 4 int n;
 5 int a[MAX];//保存当前列值 
 6 int vis1[MAX];//标记当前列 
 7 int vis2[MAX];//标记副对角线 
 8 int vis3[MAX];//标记主对角线 
 9 int cnt;
10 void dfs(int cur)
11 {
12     if(cur == n)//如果找完了,打印出来 
13     {
14         for(int i = 0; i < n; i++)
15             printf("%d ", a[i]);
16         printf("\n");
17         cnt++;
18         return;
19     }
20     int i = cur + 1;//此时是按照行来找的,所以直接遍历列就行 
21     for(int j = 1; j <= n; j++)
22     {
23         //如果列,主对角线,副对角线都满足条件,就能放 
24         if(vis1[j] == 0 && vis2[i + j] == 0 && vis3[i - j + 14] == 0)
25         {
26             //标记 
27             vis1[j] = 1;
28             vis2[i + j] = 1;
29             vis3[i - j + 14] = 1;
30             //如果满足条件,就将当前的列值给到a数组中 
31             a[cur] = j;
32             //找下一列 
33             dfs(cur + 1);
34             //取消标记, 
35             vis1[j] = 0;
36             vis2[i + j] = 0;
37             vis3[i - j + 14] = 0;
38         }
39         
40     }
41 }
42 int main()
43 {
44     while(~scanf("%d", &n))
45     {
46         cnt = 0;
47         dfs(0);
48         printf("%d\n", cnt);//统计总数 
49     }
50     return 0;
51 }

 

N皇后问题--递归回溯

标签:style   blog   io   color   for   sp   div   on   问题   

原文地址:http://www.cnblogs.com/Howe-Young/p/4066525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!