当前位置:   article > 正文

骑士周游问题(马踏棋盘算法)

骑士周游问题

简述:

        最早由印度棋手在公元前200年的时候直观的提出。该问题用现代语言来描述的话,仍是在一个具体的图中寻找哈密尔顿路径的问题。图G中的哈密尔顿路径指的是经过图G中的每一个顶点,且只经过一次的一条轨迹。如果这条轨迹是一条闭合路径,即从起点出发不重复地遍历所有的点后仍能回到起始点,那么这条路径就成为就称为哈密尔顿路径。本问题是研究马在棋盘上的跳动,能否在每个棋盘的格子里只经过一次而遍历整个棋盘?

        起始点对于整个路径的影响是非常巨大的(比如 0, 0 点),可能要将所有可以走的路径全部测试一遍,粗略的估计需要走将近  8^{64} 次,时间复杂度非常大,我跑了很长时间没跑出来,所以我就放弃了,换了别的起点。

代码实现(C语言):

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int chess[8][8] = {0}; // 初始化棋盘
  4. int step = 1; // 记录步数
  5. void recurse(int x, int y)
  6. {
  7. if ( x-2 >= 0 && y-1 >= 0 && 0 == chess[x-2][y-1] )
  8. {
  9. step ++;
  10. chess[x-2][y-1] = step;
  11. recurse(x-2, y-1);
  12. chess[x-2][y-1] = 0;
  13. step --;
  14. }
  15. if ( x-2 >= 0 && y+1 <= 7 && 0 == chess[x-2][y+1] )
  16. {
  17. step ++;
  18. chess[x-2][y+1] = step;
  19. recurse(x-2, y+1);
  20. chess[x-2][y+1] = 0;
  21. step --;
  22. }
  23. if ( x-1 >= 0 && y-2 >= 0 && 0 == chess[x-1][y-2] )
  24. {
  25. step ++;
  26. chess[x-1][y-2] = step;
  27. recurse(x-1, y-2);
  28. chess[x-1][y-2] = 0;
  29. step --;
  30. }
  31. if ( x-1 >= 0 && y+2 <= 7 && 0 == chess[x-1][y+2] )
  32. {
  33. step ++;
  34. chess[x-1][y+2] = step;
  35. recurse(x-1, y+2);
  36. chess[x-1][y+2] = 0;
  37. step --;
  38. }
  39. if ( x+1 <= 7 && y-2 >= 0 && 0 == chess[x+1][y-2] )
  40. {
  41. step ++;
  42. chess[x+1][y-2] = step;
  43. recurse(x+1, y-2);
  44. chess[x+1][y-2] = 0;
  45. step --;
  46. }
  47. if ( x+1 <= 7 && y+2 <= 7 && 0 == chess[x+1][y+2] )
  48. {
  49. step ++;
  50. chess[x+1][y+2] = step;
  51. recurse(x+1, y+2);
  52. chess[x+1][y+2] = 0;
  53. step --;
  54. }
  55. if ( x+2 <= 7 && y-1 >= 0 && 0 == chess[x+2][y-1] )
  56. {
  57. step ++;
  58. chess[x+2][y-1] = step;
  59. recurse(x+2, y-1);
  60. chess[x+2][y-1] = 0;
  61. step --;
  62. }
  63. if ( x+2 <= 7 && y+1 <= 7 && 0 == chess[x+2][y+1] )
  64. {
  65. step ++;
  66. chess[x+2][y+1] = step;
  67. recurse(x+2, y+1);
  68. chess[x+2][y+1] = 0;
  69. step --;
  70. }
  71. if ( 64 == step )
  72. {
  73. for (int i = 0; i < 8; i++)
  74. {
  75. for (int j = 0; j < 8; j++)
  76. {
  77. printf("%-3d ", chess[i][j]);
  78. }
  79. printf("\n");
  80. }
  81. exit(0);
  82. }
  83. }
  84. int main(void)
  85. {
  86. chess[2][0] = 1; // 初始化起点
  87. recurse(2, 0);
  88. return 0;
  89. }

结果:

9     2     11   14   7     4     21   18   
12   15   8     3     20   17   24   5    
1     10   13   16   25   6    19    22   
32   29   26   51   34   23   58   49   
27   52   33   30   59   50   35   40   
62   31   28   43   36   39   48   57   
53   44   63   60   55   46   41   38   
64   61   54   45   42   37   56   47

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

闽ICP备14008679号