原题链接:迷宫问题
解题思路:迪克斯特拉算法,此题权都为1,故相当于广度优先搜索算法遍历
注意事项:
借助队列进行广度优先搜索遍历
参考代码为了图方便,并未用循环队列,此时应注意容量应该足够大
另外用到了部分C++中的语法
参考代码:
#include<stdio.h>
#include<stdlib.h>
#define INIT_QUEUE_SIZE 10001
typedef struct Node{//定义坐标
int x;
int y;
}Node;
typedef struct Queue{//定义顺序队列
Node* front;
Node* rear;
}Queue;
void InitQueue(Queue &Q);
void EnQueue(Queue &Q,Node data);
void DeQueue(Queue &Q);
int EmptyQueue(Queue &Q);
/***************************************************/
int main()
{
int T,N,M;
scanf("%d",&T);//n组数据
while(T--)
{
Node start,end;
int distance=0;//路程
int flag=0;
Node* p=NULL;
scanf("%d%d",&N,&M);
getchar();
int Map[N][M],Mark[N][M];//Mark用来标记已经遍历过的点,防止再次遍历
int next[4][2] = { //定义四个位移矢量
{0,1},
{1,0},
{0,-1},
{-1,0}
};
for(int i=0;i<N;i++)//创建迷宫地图
{
for(int j=0;j<M;j++)
{
Map[i][j]=getchar();
if(Map[i][j]=='S')
start.x=i,start.y=j;
if(Map[i][j]=='E')
end.x=i,end.y=j;
}
getchar();
}
Queue Q;
InitQueue(Q);
EnQueue(Q,start);
p=Q.front;
Mark[start.x][start.y]=1;
while(!EmptyQueue(Q))
{
Node tmp;
for(int i=0;i<4;i++) //对旁边的四个点进行操作
{
tmp.x=Q.front->x+next[i][0];
tmp.y=Q.front->y+next[i][1];
if(tmp.x<N&&tmp.x>=0)
if(tmp.y<M&&tmp.y>=0)
if(Map[tmp.x][tmp.y]!='#'&&Mark[tmp.x][tmp.y]!=1)//检验四个旁边点是否可以通过
{
EnQueue(Q,tmp);
Mark[tmp.x][tmp.y]=1;
if(tmp.x==end.x&&tmp.y==end.y) //遍历到终点,算出路程,直接退出
{distance=distance+1;
flag=1;
goto quit;}
}
} if(Q.front==p) //用p标记队列中距离为distance的最后一个结点,当距离distance的结点的相邻点遍历完之后,距离+1,p指向距离为新的distance的最后一个结点
{
p=--Q.rear;
Q.rear++;
distance++;
}
DeQueue(Q);
}
quit :
if(flag==0)//不存在这样的路径
distance=-1;
printf("%d\n",distance);
}
return 0;
}
/**********************************************************/
void InitQueue(Queue &Q)
{
Q.front=Q.rear=(Node*)malloc(sizeof(Node)*INIT_QUEUE_SIZE);
}
void EnQueue(Queue &Q,Node data)
{
Q.rear->x=data.x;
Q.rear->y=data.y;
Q.rear++;
}
void DeQueue(Queue &Q)
{
Q.front++;
}
int EmptyQueue(Queue &Q)
{
if(Q.front==Q.rear)
return 1;
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复