首页 > 其他 > 详细

八皇后问题(回溯法)

时间:2019-03-15 16:07:49      阅读:159      评论:0      收藏:0      [点我收藏+]

1.八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

2.要点及思路

通过思考发现,暴力算法可以进行优化,当已经放置了一部分皇后时,可能剩余的皇后无论如何放置都不可能合法,此时也没必要递归下去了,直接返回上层即可。

比如在5×5的皇后中:(1,3)(2,5)(3,1)已经放置了皇后,剩下的两个无论如何放置都不可能合法。

 

代码如下

 1 #include<cstdio>
 2 #include<cstdlib>
 3 using namespace std;
 4 int n, P[20+1], hashTable[20+1];
 5 int count = 0;
 6 void generateP(int index){
 7     if(index == n+1) {
 8         count++;
 9         return ;
10     }
11     for(int x = 1; x <= n; x++) {
12         if(hashTable[x] == false) {
13             bool flag = true;
14             for(int pre = 1; pre < index; pre++) {
15                 if(abs(index - pre) == abs(x - P[pre])) {
16                     flag = false;
17                     break;
18                 }
19             }
20             if(flag) {
21                 P[index] = x;
22                 hashTable[x] = true;
23                 generateP(index + 1);
24                 hashTable[x] = false;
25             }
26         }
27     }
28 }
29 int main()
30 {
31     scanf("%d", &n);
32     generateP(1);
33     printf("%d\n", count);
34     return 0;
35 }

 

八皇后问题(回溯法)

原文:https://www.cnblogs.com/really41/p/10537363.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!