标签:count 20 int 问题 放置 回溯 皇后 include
<h1>八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
<h2>要点及思路
通过思考发现,暴力算法可以进行优化,当已经放置了一部分皇后时,可能剩余的皇后无论如何放置都不可能合法,此时也没必要递归下去了,直接返回上层即可。
比如在5×5的皇后中:(1,3)(2,5)(3,1)已经放置了皇后,剩下的两个无论如何放置都不可能合法。
<h2>
代码如下
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 }
标签:count,20,int,问题,放置,回溯,皇后,include 来源: https://www.cnblogs.com/really41/p/10537363.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。