解题思路:利用广搜遍历

注意事项:若无路径则为-1

参考代码:

#include<stdio.h>

char c[200][200];//创建迷宫数组

int a,b;//迷宫大小

int q[4][2]={-1,0,0,1,1,0,0,-1};//4个方向移动

void op(int tarx,int tary)

{

int book[200][200];//book用于记录哪些点已遍历过

for(int i=0;i<a;i++)

for(int j=0;j<b;j++)

book[i][j]=0;

struct op//队列

{

int x;//横坐标

int y;//纵坐标

int s;//步数

}que[400];//定义队列

int flat=1,head=1;//head表示正扩展的结点,tail位于队尾最后一个元素的后面随时将head扩展出来的结点入队

que[flat].x=tarx;

que[flat].y=tary;

que[flat].s=0;

book[tarx][tary]=1;

flat++;

int tx,ty;

while(head<flat)

{

for(int i=0;i<4;i++)//枚举4个方向

{

tx=que[head].x+q[i][0];

ty=que[head].y+q[i][1];

if(tx<0||tx>=a||ty<0||ty>=b)//判断是否出界

continue;

if(book[tx][ty]==0&&c[tx][ty]!='#')//判断是否为障碍,是否已经走过

{

book[tx][ty]=1;//记录当前节点已走过,广搜每个节点只搜索一次

que[flat].x=tx;

que[flat].y=ty;

que[flat].s=que[head].s+1;

flat++;//每入队一次tail++

}

if(c[tx][ty]=='E')//是否找到出口

{

printf("%d\n",que[flat-1].s);

return;

}

}

head++;

}

printf("-1\n");//没找到出口输出-1

}

int main()

{

int n;

scanf("%d",&n);

for(int i=0;i<n;i++)

{

int tarx,tary;

scanf("%d%d",&a,&b);

for(int j=0;j<a;j++)

scanf("%s",c[j]);

for(int j=0;j<a;j++)

{

int k=0;

for(int u=0;u<b;u++)

{

if(c[j][u]=='S')//找起点

{

tarx=j;

tary=u;

k=1;

break;

}

}

if(k)

break;

}

op(tarx,tary);//起点,终点

}

}


点赞(1)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论