当前位置:   article > 正文

n皇后问题 栈操作_用栈求解n皇后问题 c

用栈求解n皇后问题 c

       在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上)。你的任务是,对于给定的N,求出有多少种合法的放置方法。

       要求利用栈的操作解决此问题。借此熟悉栈的相关操作。思想方法仍然是回溯。

 

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. typedef struct
  5. {
  6. int data[20];
  7. int top;
  8. } SqStack;
  9. bool judge_place(int *data,int k)
  10. {
  11. int i;
  12. for(i=1; i<k; ++i)
  13. if(data[k]==data[i]||abs(data[k]-data[i])==abs(k-i))
  14. return false;
  15. return true;
  16. }
  17. void print(int *data,int n)
  18. {
  19. int i,j;
  20. for(i=1; i<=n; ++i)
  21. {
  22. for(j=1; j<data[i]; ++j)
  23. cout<<'*';
  24. cout<<'Q';
  25. for(j=data[i]+1; j<=n; ++j)
  26. cout<<'*';
  27. cout<<endl;
  28. }
  29. cout<<endl;
  30. }
  31. int main()
  32. {
  33. SqStack st;
  34. int n,ans=0;
  35. st.top=1;
  36. st.data[st.top]=0;
  37. cin>>n;
  38. while(st.top>0)
  39. {
  40. ++st.data[st.top];
  41. while(st.data[st.top]<=n&&!judge_place(st.data,st.top))
  42. ++st.data[st.top];
  43. if(st.data[st.top]==n+1)//找到第n个仍然不符合
  44. {
  45. st.data[st.top]=0;//当前行的棋子位置置为0
  46. --st.top;//当前行退栈
  47. continue;
  48. }
  49. if(st.top==n)//找到一个答案
  50. {
  51. print(st.data,n);
  52. ++ans;
  53. --st.top;//退回到倒数第二行继续尝试
  54. }
  55. else//当前行找到可以放的位置
  56. {
  57. ++st.top;//下一行进栈
  58. st.data[st.top]=0;
  59. }
  60. }
  61. cout<<"total: "<<ans<<" ans";
  62. return 0;
  63. }

个人网站:https://jqh.zone

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/633190
推荐阅读
相关标签
  

闽ICP备14008679号