前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【剑指offer】八皇后问题

【剑指offer】八皇后问题

作者头像
bear_fish
发布2018-09-20 15:54:44
3660
发布2018-09-20 15:54:44
举报

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26614999

    剑指offer上解决八皇后问题,没有用传统的递归或非递归回溯法,而是用了很巧妙的全排列法。

    先说下八皇后问题:在8 X 8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处于同一行,同一列或者同意对角线上,求出所有符合条件的摆法。

    全排列解决八皇后问题的思路如下:

    由于8个皇后不能处在同一行,那么肯定每个皇后占据一行,这样可以定义一个数组A[8],数组中第i个数字,即A[i]表示位于第i行的皇后的列号。先把数组A[8]分别用0-7初始化,接下来对该数组做全排列,由于我们用0-7这7个不同的数字初始化数组,因此任意两个皇后肯定也不同列,那么我们只需要判断每个排列对应的8个皇后中是否有任意两个在同一对角线上即可,即对于数组的两个下标i和j,如果i-j==A[i]-A[j]或i-j==A[j]-A[i],则认为有两个元素位于了同一个对角线上,则该排列不符合条件。

    代码如下:

[cpp] view plaincopy

  1. #include<stdio.h>
  2. void swap(int *a,int *b)  
  3. {  
  4. int temp = *a;  
  5.     *a = *b;  
  6.     *b = temp;  
  7. }  
  8. /*
  9. 如果有符合条件的摆法,打印出所有的摆法,否则,什么也不打印
  10. */
  11. void CubVertex(int *A,int len,int begin)  
  12. {  
  13. if(A==NULL || len!=8)  
  14. return;  
  15. if(begin == len-1)  
  16.     {  
  17. int i,j;  
  18. bool can = true;    //是否又符合条件的摆法
  19. for(i=0;i<len;i++)  
  20. for(j=i+1;j<len;j++)  
  21. if(i-j==A[i]-A[j] || i-j==A[j]-A[i])  
  22.                 {  
  23. //如果任意两个在一条对角线上,则不符合
  24.                     can = false;  
  25. break;  
  26.                 }  
  27. //有符合的摆法,就打印出来
  28. if(can)  
  29.         {  
  30. for(i=0;i<len;i++)  
  31.                 printf("%d ",A[i]);  
  32.             printf("\n");  
  33.         }  
  34.     }  
  35. else
  36.     {  
  37. int i;  
  38. for(i=begin;i<len;i++)  
  39.         {  
  40.             swap(&A[begin],&A[i]);  
  41.             CubVertex(A,len,begin+1);  
  42.             swap(&A[begin],&A[i]);  
  43.         }  
  44.     }  
  45. }  
  46. int main()  
  47. {  
  48. int A[8] = {0,1,2,3,4,5,6,7};  
  49.     CubVertex(A,8,0);  
  50. return 0;  
  51. }  

    测试结果:

    四皇后:

    四皇后总共有2中摆法。

    1、3、0、2的意思是指:第0行上的皇后摆放在第1个位置(从0开始),第1行上的皇后摆放在第3个位置,第3行上的皇后摆放在第0个位置,第4行上的皇后摆放在第2个位置。

    八皇后:

    八皇后总共有92种摆法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年02月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档