当前位置:   article > 正文

递归--小游戏_小游戏 题目描述 一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个挣

小游戏 题目描述 一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个挣

问题描述:

一天早上,你起床的时候想,我编程这么牛,为什么不靠这个赚点小钱呢?............不在赘述。

也就是连接卡片的程序,在pku百练里面有的。


程序源代码:

  1. #include "stdio.h"
  2. #include "memory.h"
  3. #define MAXIN 75
  4. char board[MAXIN+2][MAXIN+2];//定义面板
  5. int minstep,w,h,to[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//定义标记方向
  6. bool mark[MAXIN+2][MAXIN+2];//定义标记数组
  7. void search(int now_x,int now_y,int end_x,int end_y,int step,int f){
  8. if (step>minstep){
  9. return;
  10. }//完全可以不设置这个判断,只是为了判断step的
  11. if (now_x==end_x&&now_y==end_y){
  12. if (step<minstep){//更新 因为在这之前minstep一直等于100000
  13. minstep=step;
  14. return;
  15. }
  16. }
  17. //开始枚举方向
  18. for (int i=0;i<4;i++){
  19. int x=now_x+to[i][0];//得到新的位置
  20. int y=now_y+to[i][1];
  21. if (((-1<x)&&(x<w+2)&&(-1<y)&&(y<h+2))
  22. &&(((board[y][x]==' ')&&(mark[y][x]==false))||
  23. (board[y][x]=='X')&&(x==end_x)&&(y=end_y))){
  24. //在范围之内
  25. //普通选择,即是空格,且不曾被标记。因为一开始都是false
  26. //最后一种情况,即到达终点,且终点存放X
  27. //开始判断
  28. mark[y][x]=true;//说明有效
  29. if (f==i){
  30. search(x,y,end_x,end_y,step,i);
  31. }
  32. else{
  33. search(x,y,end_x,end_y,step+1,i);
  34. }
  35. //注意,此处判断完全可以没有任何返回值的。就是不起作用,比如说遇到墙而不是空白
  36. //那就直接返回,反正不会有任何返回值的。
  37. //如果无效,则记为没有作用
  38. //记为没有走过
  39. mark[y][x]=false;
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. int Boardnum=0;
  46. while (scanf("%d %d",&w,&h)){
  47. if(w==0&&h==0)
  48. break;
  49. Boardnum++;
  50. printf("Board #%d:\n",Boardnum);
  51. //先是输入几行几列,再输出第几块板子
  52. int i,j;
  53. for (i=0;i<MAXIN+2;i++){
  54. board[0][i]=board[i][0]=' ';
  55. }//初始化全部空格
  56. for (i=1;i<=h;i++){
  57. getchar();
  58. for(j=1;j<=w;j++){
  59. board[i][j]=getchar();
  60. }
  61. }//读入矩形板的布局
  62. for (i=0;i<=w;i++){
  63. board[h+1][i+1]=' ';
  64. }
  65. for (i=0;i<=h;i++){
  66. board[i+1][w+1]=' ';
  67. }//板子最外层赋空格
  68. int begin_x,begin_y,end_x,end_y,count=0;
  69. while (scanf("%d %d %d %d",&begin_x,&begin_y,&end_x,&end_y)&&begin_x){
  70. count++;
  71. minstep=100000;
  72. memset(mark,false,sizeof(mark));
  73. //开始递归搜索
  74. search(begin_x,begin_y,end_x,end_y,0,-1);
  75. if (minstep<100000){
  76. printf("Pair %d:%d segments.\n",count,minstep);
  77. }
  78. else{
  79. printf("Pair %d: impossible.\n",count);
  80. }
  81. }
  82. printf("\n");
  83. }
  84. return 0;
  85. }


对程序的理解写在程序中,当然以后还会再做这题,到时候继续更新。







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

闽ICP备14008679号