开始用dfs写,果然用递归写会超时,剪枝又麻烦,所以选择用bfs

直接贴代码,代码都有注释

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. char a[100][100];//用于存储迷宫
  5. int m,n;
  6. int b[100][100];//标记是否访问
  7. int queue[10000][3];//存储点及其走过的路程长短
  8. int x[]={0,0,1,-1};
  9. int y[]={1,-1,0,0};
  10. int bfs(int i,int j)//广度优先遍历
  11. {
  12. int k,tx,ty,cx,cy;
  13. int head=0,tail=0;
  14. int count;
  15. queue[tail][0]=i;
  16. queue[tail][1]=j;
  17. queue[tail][2]=0;//初始路程为0
  18. tail++;
  19. b[i][j]=0;
  20. while(head<tail)//当队列中不为空时循环
  21. {
  22. cx=queue[head][0];
  23. cy=queue[head][1];
  24. count=queue[head][2];//取出队头元素及其路程
  25. head++;
  26. for(k=0;k<4;k++)
  27. {
  28. tx=cx+x[k];
  29. ty=cy+y[k];
  30. if(tx>=0&&tx<m&&ty>=0&&ty<n&&b[tx][ty]&&a[tx][ty]!='#')//四个方向
  31. {
  32. if(a[tx][ty]=='E')//如果到达出口则返回,广度优先遍历先找到的第一个是最短路程
  33. {
  34. return count+1;
  35. }
  36. queue[tail][0]=tx;
  37. queue[tail][1]=ty;
  38. queue[tail][2]=count+1;//上一点的路程加1后放入队列
  39. tail++;
  40. b[tx][ty]=0;//标记置0
  41. }
  42. }
  43. }
  44. return -1;
  45. }
  46. int main()
  47. {
  48. int T,i,j,k,z;//数据的组数
  49. char c;
  50. scanf("%d",&T);
  51. for(i=0;i<T;i++)
  52. {
  53. scanf("%d%d",&m,&n);//m:行,n:列
  54. getchar();//读取换行
  55. for(j=0;j<m;j++)
  56. {
  57. for(k=0;k<n;k++)
  58. {
  59. c=getchar();
  60. a[j][k]=c;
  61. }
  62. getchar();//读取换行
  63. }
  64. for(j=0;j<m;j++)
  65. {
  66. for(k=0;k<n;k++)
  67. {
  68. b[j][k]=1;
  69. }
  70. }
  71. for(j=0;j<m;j++)
  72. {
  73. for(k=0;k<n;k++)
  74. {
  75. if(a[j][k]=='S')
  76. printf("%d\n",bfs(j,k));
  77. }
  78. }
  79. }
  80. }
点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论