当前位置:   article > 正文

数据结构--5.2马踏棋盘算法(骑士周游问题)_马踏棋盘问题

马踏棋盘问题

题目渊源:

        马踏棋盘问题(又称骑士周游问题或骑士漫游问题)是算法设计的经典问题之一。

题目要求:

        国际象棋的棋盘为8*8的方格棋盘,现将“马”放在任意指定的方格中,按照“马”走棋的规则将“马”进行移动。要求每个方格只能进入一次,最终使得“马”走遍棋盘64个方格。

        

  1. #include <stdio.h>
  2. #include <time.h>
  3. #define X 8
  4. #define Y 8
  5. int chess[X][Y];
  6. //找到基于(x,y)位置的下一个可走的位置
  7. int nextxy(int *x,int *y,int count)
  8. {
  9. switch(count)
  10. {
  11. case 0:
  12. if(*x+2<=X-1 && *y-1>=0 && chess[*x+2][*y-1]==0)
  13. {
  14. *y+=2;
  15. *y-=1;
  16. return 1;
  17. }
  18. break;
  19. case 1:
  20. if(*x+2<=X-1 && *y+1<=Y-1 && chess[*x+2][*y+1]==0 )
  21. {
  22. *x+=2;
  23. *y+=1;
  24. return 1;
  25. }
  26. break;
  27. case 2:
  28. if(*x+1<=X-1 && *y-2>=0 && chess[*x+1][*y-2]==0 )
  29. {
  30. *x=*x+1;
  31. *y=*y-2;
  32. return 1;
  33. }
  34. break;
  35. case 3:
  36. if(*x+1<=X-1 && *y+2<=Y-1 && chess[*x+1][*y+2]==0)
  37. {
  38. *x = *x+1;
  39. *y= *y+2;
  40. return 1;
  41. }
  42. break;
  43. case 4:
  44. if(*x-2>=0 && *y-1>=0 && chess[*x-2][*y-1]==0)
  45. {
  46. *x= *x-2;
  47. *y= *y+1;
  48. return 1;
  49. }
  50. break;
  51. case 5:
  52. if(*x-2>=0 && *y+1<=Y-1 && chess[*x-2][*y+1]==0 )
  53. {
  54. *x= *x-2;
  55. *y = *y+1;
  56. return 1;
  57. }
  58. break;
  59. case 6:
  60. if(*x-1>=0 && *y-2>=0 && chess[*x-1][*y-2]==0)
  61. {
  62. *x = *x - 1;
  63. *y = *y - 2;
  64. return 1;
  65. }
  66. break;
  67. case 7:
  68. if(*x-1>=0 && *y+2<=Y-1 && chess[*x-1][*y+2]==0)
  69. {
  70. *x = *x -1;
  71. *y = *y +2;
  72. return 1;
  73. }
  74. break;
  75. default:
  76. break;
  77. }
  78. return 0;
  79. }
  80. void print()
  81. {
  82. int i,j;
  83. for(i=0;i<X;i++)
  84. {
  85. for(j=0;j<Y;j++)
  86. {
  87. printf("%2d\t",chess[i][j]);
  88. }
  89. printf("\n");
  90. }
  91. printf("\n");
  92. }
  93. //深度优先遍历棋盘
  94. //(x,y)为位置坐标
  95. //tag是标记变量
  96. int TravelChessBoard(int x,int y,int tag)
  97. {
  98. int x1= x,y1=y,count =0,flag =0;
  99. chess[x][y] = tag;
  100. if(x*Y == tag)
  101. {
  102. //打印棋盘
  103. print();
  104. return 1;
  105. }
  106. //找到马的下一个可走的坐标(x1,y1)
  107. flag = nextxy(&x1,&y1,count);
  108. while(0==flag && count<7)
  109. {
  110. count++;
  111. }
  112. while(flag)
  113. {
  114. if(TravelChessBoard(x1,y1,tag+1))
  115. {
  116. return 1;
  117. }
  118. //出现意外,找到马的下一步可走坐标(x1,y1)
  119. x1=x;
  120. y1=y;
  121. count++;
  122. flag = nextxy(&x1,&y1,count);
  123. while(0==flag && count < 7)
  124. {
  125. count++;
  126. flag = nextxy(&x1,&y1,count);
  127. }
  128. }
  129. if(0 == flag)
  130. {
  131. chess[x][y] =0;
  132. }
  133. return 0;
  134. }
  135. int main()
  136. {
  137. int i,j;
  138. clock_t start,finish;
  139. start = clock();
  140. for(i=0;i<X;i++)
  141. {
  142. for(j=0;j<Y;j++)
  143. {
  144. chess[i][j]=0;
  145. }
  146. }
  147. if(TravelChessBoard(2,0,1))
  148. {
  149. printf("抱歉,马踏棋盘失败!\n");
  150. }
  151. finish = clock();
  152. printf("\n本次计算一共耗时:%f秒\n\n",(double)(finish - start)/CLOCKS_PER_SEC);
  153. return 0;
  154. }

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

闽ICP备14008679号