点击打开链接但是推荐你看看这个博客写的太好的这道题
今天终于改了很久把这个题给弄好了~就是有一个问题不明白~就是标记问题,但是这里标记不是按它是否访问够来做标准来标记它而是看它访问时所剩的时间来分,因为它会往回走,剩下的时间越多越好,在这里因为它数据不是很大,所以我就不写标记的事了,。
这个题就是迷宫的感觉但是第一步就是找出从哪里开始,所以用一个结构体来记下开始点,
#include<stdio.h>
#include<string.h>
#include<queue>
int a[70][70],n,m;
int movex[4]={-1,1,0,0};
int movey[4]={0,0,-1,1};
using namespace std;
struct app
{
int x,y,time;
int mark;
}S[10];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int stratx,straty;
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(S,0,sizeof(S));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==2)
{
S[0].x=i;
S[0].y=j;
S[0].time=6;
S[0].mark=0; //记下走到这一步用的时间,不能用time 来记录因为你不知道什么time重新被设置成6
}
}//把迷宫的布局存在二维数组里,并且标记下开始的点。
queue<app> q;
int flag=0;
while(!q.empty()) q.pop();
q.push(S[0]);
while(!q.empty())
{
S[1]=q.front();
q.pop();
if(a[S[1].x][S[1].y]==3)
{
if(S[1].time>0)
printf("%d\n",S[1].mark);
else
puts("-1");
flag=1;
break;
}
if(a[S[1].x][S[1].y]==4)
{
S[1].time=6;
a[S[1].x][S[1].y]=0;
}
for(int i=0;i<4;i++)
{
S[2].x=S[1].x+movex[i]; //这种方法比较好,用来代替四个方向。
S[2].y=S[1].y+movey[i];
S[2].time=S[1].time-1;
S[2].mark=S[1].mark+1;
if(S[2].x<0||S[2].x>n||S[2].y<0||S[2].y>m)
continue;
if(a[S[2].x][S[2].y]==0)
continue;
if(S[2].time<=0)
continue;
q.push(S[2]);
}
}
if(!flag)
puts("-1");
}
return 0;
}
本文介绍了一种迷宫寻路算法的实现方法,通过结构体记录起点信息,并使用队列进行广度优先搜索。文章详细解释了如何利用时间限制和标记机制找到目标位置。
1435

被折叠的 条评论
为什么被折叠?



