069.骑士巡游

举报
C语言与CPP编程 发表于 2022/05/01 23:16:27 2022/05/01
【摘要】 ///* 骑士巡游问题 *// #include <stdio.h>int f[11][11] ; /*定义一个矩阵来模拟棋盘*/int adjm[12...

  
  1. //
  2. /* 骑士巡游问题 */
  3. /
  4. #include <stdio.h>
  5. int f[11][11] ; /*定义一个矩阵来模拟棋盘*/
  6. int adjm[121][121];/*标志矩阵,即对于上述棋盘,依次进行编号
  7. 1--121(行优先)可以从一个棋盘格i跳到棋盘格j时,adjm[i][j]=1*/
  8. void creatadjm(void); /*创建标志矩阵函数声明*/
  9. void mark(int,int,int,int); /*将标志矩阵相应位置置1*/
  10. void travel(int,int); /*巡游函数声明*/
  11. int n,m; /*定义矩阵大小及标志矩阵的大小*/
  12. /******************************主函数***********************************/
  13. int main()
  14. {
  15. int i,j,k,l;
  16. printf("Please input size of the chessboard: "); /*输入矩阵的大小值*/
  17. scanf("%d",&n);
  18. m=n*n;
  19. creatadjm(); /*创建标志矩阵*/
  20. puts("The sign matrix is:");
  21. for(i=1;i<=m;i++) /*打印输出标志矩阵*/
  22. {
  23. for(j=1;j<=m;j++)
  24. printf("%2d",adjm[i][j]);
  25. printf("\n");
  26. }
  27. printf("Please input the knight's position (i,j): "); /*输入骑士的初始位置*/
  28. scanf("%d %d",&i,&j);
  29. l=(i-1)*n+j; /*骑士当前位置对应的标志矩阵的横坐标*/
  30. while ((i>0)||(j>0)) /*对骑士位置的判断*/
  31. {
  32. for(i=1;i<=n;i++) /*棋盘矩阵初始化*/
  33. for(j=1;j<=n;j++)
  34. f[i][j]=0;
  35. k=0; /*所跳步数计数*/
  36. travel(l,k); /*从i,j出发开始巡游*/
  37. puts("The travel steps are:");
  38. for(i=1;i<=n;i++) /*巡游完成后输出巡游过程*/
  39. {
  40. for(j=1;j<=n;j++)
  41. printf("%4d",f[i][j]);
  42. printf("\n");
  43. }
  44. printf("Please input the knight's position (i,j): ");/*为再次巡游输入起始位置*/
  45. scanf("%d %d",&i,&j);
  46. l=(i-1)*n+j;
  47. }
  48. puts("\n Press any key to quit... ");
  49. getch();
  50. return 0;
  51. }
  52. /*****************************创建标志矩阵子函数*************************/
  53. void creatadjm()
  54. {
  55. int i,j;
  56. for(i=1;i<=n;i++) /*巡游矩阵初始化*/
  57. for(j=1;j<=n;j++)
  58. f[i][j]=0;
  59. for(i=1;i<=m;i++) /*标志矩阵初始化*/
  60. for(j=1;j<=m;j++)
  61. adjm[i][j]=0;
  62. for(i=1;i<=n;i++)
  63. for(j=1;j<=n;j++)
  64. if(f[i][j]==0) /*对所有符合条件的标志矩阵种元素置1*/
  65. {
  66. f[i][j]=1;
  67. if((i+2<=n)&&(j+1<=n)) mark(i,j,i+2,j+1);
  68. if((i+2<=n)&&(j-1>=1)) mark(i,j,i+2,j-1);
  69. if((i-2>=1)&&(j+1<=n)) mark(i,j,i-2,j+1);
  70. if((i-2>=1)&&(j-1>=1)) mark(i,j,i-2,j-1);
  71. if((j+2<=n)&&(i+1<=n)) mark(i,j,i+1,j+2);
  72. if((j+2<=n)&&(i-1>=1)) mark(i,j,i-1,j+2);
  73. if((j-2>=1)&&(i+1<=n)) mark(i,j,i+1,j-2);
  74. if((j-2>=1)&&(i-1>=1)) mark(i,j,i-1,j-2);
  75. }
  76. return;
  77. }
  78. /*********************************巡游子函数*******************************/
  79. void travel(int p,int r)
  80. {
  81. int i,j,q;
  82. for(i=1;i<=n;i++)
  83. for(j=1;j<=n;j++)
  84. if(f[i][j]>r) f[i][j]=0; /*棋盘矩阵的置〉r时,置0*/
  85. r=r+1; /*跳步计数加1*/
  86. i=((p-1)/n)+1; /*还原棋盘矩阵的横坐标*/
  87. j=((p-1)%n)+1; /*还原棋盘矩阵的纵坐标*/
  88. f[i][j]=r; /*将f[i][j]做为第r跳步的目的地*/
  89. for(q=1;q<=m;q++) /*从所有可能的情况出发,开始进行试探式巡游*/
  90. {
  91. i=((q-1)/n)+1;
  92. j=((q-1)%n)+1;
  93. if((adjm[p][q]==1)&&(f[i][j]==0))
  94. travel(q,r); /*递归调用自身*/
  95. }
  96. return;
  97. }
  98. /*************************赋值子函数***************************************/
  99. void mark(int i1,int j1,int i2,int j2)
  100. {
  101. adjm[(i1-1)*n+j1][(i2-1)*n+j2]=1;
  102. adjm[(i2-1)*n+j2][(i1-1)*n+j1]=1;
  103. return;
  104. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124518215

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。