当前位置:   article > 正文

皇后的控制力(C++语言)_python4皇后问题

python4皇后问题

题目描述:

我们对八皇后问题进行扩展。

国际象棋中的皇后非常神勇,一个皇后可以控制横、竖、斜线等4个方向(或者说是8个方向),只要有棋子落入她的势力范围,则必死无疑,所以对方的每个棋子都要小心地躲开皇后的势力范围,选择一个合适的位置放置。如果在棋盘上有两个皇后,则新皇后控制的势力范围与第一个皇后控制的势力范围可以进行叠加,这样随着皇后数量的增加,皇后们控制的范围越来越大,直至控制了棋盘中全部的格子。

现在我们关心的是,如果在 N×N 的棋盘上放入 M 个皇后(M个皇后相互之间不能冲突)控制棋盘中的格子,则共有多少种不同的放置方法?

输入:N (N <= 10)  M (M <= N)

输出:如果将 M 个皇后放入 N×N 的棋盘中可以控制全部棋盘中的格子,则不同的放置方法的数量


样例

输入(1)

2 1

输出(1)

4

输入(2)

3 1

输出(2)

1

代码

  1. #include <iostream>
  2. using namespace std;
  3. int n, m, tot;
  4. int *row, *column, *slash, *reslash;
  5. int judge() {
  6. for (int i = 1; i <= n; i++) {
  7. if (row[i] == 999) {
  8. for (int j = 1; j <= n; j++) {
  9. if (column[j] == 999) {
  10. if (!(reslash[i + j] == 1 || slash[n + i - j + 1] == 1)) {
  11. return 0;
  12. }
  13. }
  14. }
  15. }
  16. }
  17. return 1;
  18. }
  19. void traceback(bool flag, int level, int num) {
  20. if (level > n) {
  21. if (num != m) {
  22. return;
  23. }
  24. if (judge()) {
  25. tot++;
  26. }
  27. return;
  28. }
  29. if (n - level + num < m) {
  30. return;
  31. }
  32. if (!flag) {
  33. traceback(false, level + 1, num);
  34. traceback(true, level + 1, num + 1);
  35. } else {
  36. for (int i = 1; i <= n; i++) {
  37. if (column[i] == 999 && reslash[level + i] == 999 && slash[n + level - i + 1] == 999) {
  38. row[level] = level;
  39. column[i] = i;
  40. reslash[level + i] = 1;
  41. slash[n + level - i + 1] = 1;
  42. traceback(false, level + 1, num);
  43. traceback(true, level + 1, num + 1);
  44. row[level] = 999;
  45. column[i] = 999;
  46. reslash[level + i] = 999;
  47. slash[n + level - i + 1] = 999;
  48. }
  49. }
  50. }
  51. }
  52. int main() {
  53. cin >> n >> m;
  54. column = new int[n + 1];
  55. row = new int[n + 1];
  56. slash = new int[2 * n + 1];
  57. reslash = new int[2 * n + 1];
  58. for (int i = 0; i <= n; i++) {
  59. column[i] = row[i] = 999;
  60. }
  61. for (int i = 0; i < 2 * n + 1; i++) {
  62. slash[i] = reslash[i] = 999;
  63. }
  64. tot = 0;
  65. traceback(false, 1, 0);
  66. traceback(true, 1, 1);
  67. cout << tot << endl;
  68. delete[] column;
  69. delete[] row;
  70. delete[] slash;
  71. delete[] reslash;
  72. return 0;
  73. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/64121
推荐阅读
相关标签
  

闽ICP备14008679号