当前位置:   article > 正文

N皇后问题的栈实现方法

N皇后问题的栈实现方法

题目

最近在复习数据结构的栈这块时看到的书后习题,大一初学c那会儿一直觉得N皇后问题是个很难的问题,系统的学习完数据结构再来看这道题已经有了不一样的思考方向了。

此处不在赘述n皇后问题的具体内容,直接放源码

源码

  1. #include<stdio.h>
  2. #include<math.h>
  3. #define N 12
  4. int N_Queen(int n)
  5. {
  6. if (n <= 2)return -1;
  7. int i, j, num = 0;
  8. int s[100];
  9. int top = -1, x;
  10. int pass, pre, find;
  11. s[++top] = 0;
  12. while (top != -2)//不等于-2是由于回溯时第一行已经被遍历完,导致top指向-2(虽然不方便理解,但可以减少一次判断)
  13. {
  14. x = top; pre = -1;
  15. if (x == N - 1)
  16. {
  17. num++;
  18. pre = s[--top];
  19. --top;
  20. x = x - 2;
  21. }
  22. while (top!=-2)//回溯循环
  23. {
  24. find = 0;
  25. for (j =pre+1; j < N; j++)
  26. {
  27. pass = 1;
  28. for (i = top; i >= 0; i--)//筛选循环
  29. {
  30. if (j ==s[i] || abs(x + 1 - i) == abs(j - s[i]))
  31. {
  32. pass = 0;
  33. break;//该列与任意一个栈内的合法皇后不满足条件,就进入下一列。
  34. }
  35. }
  36. if (pass)//x+1行找到一个合法皇后
  37. {
  38. s[++top]=j; //将其入栈
  39. find = 1;
  40. break;
  41. }
  42. }
  43. if (!find)//如果x+1一整行没有找到合法皇后
  44. {
  45. pre = s[top--];//回溯
  46. x--;
  47. }
  48. else break;
  49. }
  50. }
  51. return num;
  52. }
  53. int main()
  54. {
  55. printf("%d\n",N_Queen(N));
  56. }

 其他

其实还有一些比较容易实现的优化,比如n皇后问题的解是左右对称的,因此我们只需要针对偶数n和奇数n设定好终止位置,将已知解的个数通过公式计算出来即可(比如偶数n皇后问题只需要求出左半边的所有解即可)

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

闽ICP备14008679号