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


    题目渊源:

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

    题目要求:

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

            

    1. #include
    2. #include
    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
    84. {
    85. for(j=0;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
    141. {
    142. for(j=0;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. }

  • 相关阅读:
    IP协议-服务类型字段
    单链表的实现(单链表的增删查改)
    git 回滚到指定版本
    JavaScript查找最长的公共前缀
    Toolformer论文阅读笔记(简略版)
    【Docker】Dockerfile构建镜像
    Qt学习02 GUI程序实例分析
    .net core 抛异常对性能影响的求证之路
    webhook-django框架
    包装印刷行业万界星空科技云MES解决方案
  • 原文地址:https://blog.csdn.net/ww1425408527/article/details/132603467