#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
#include<string.h>
#include<map>
#include<cmath>
#include<queue>
#define ll long long
#define INF 0x7fffffff
#define MAX 0x3f3f3f3f
#define maxn 1000005
#define ull unsigned long long
using namespace std;
int r,c,k,sx,sy,ex,ey,num;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
char f[105][105];
char v[105][105][10];
//由于石头会在K的整数倍时间时消失,开三维数组来记录点的状态。
struct Node
{
int x,y,step;
};
void bfs()
{
num=0;
queue<Node> q;
Node a,b;
a.x=sx;a.y=sy;a.step=0;
q.push(a);
v[sx][sy][0]=1;//标记起点走过
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==ex&&a.y==ey)
{
num=a.step;
return;
}
for(int i=0;i<4;i++)
{
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
b.step=a.step+1;
if(b.x<1||b.x>r||b.y<1||b.y>c||(f[b.x][b.y]=='#'&&b.step%k)||v[b.x][b.y][b.step%k]);
//碰到了障碍且步数不是k的倍数,或者走过
//但k的整数倍是可以重复走的
else
{
v[b.x][b.y][b.step%k]=1;
q.push(b);
}
}
}
return;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&r,&c,&k);
for(i=1;i<=r;i++)
{
getchar();
for(j=1;j<=c;j++)
{
scanf("%c",&f[i][j]);
if(f[i][j]=='Y') sx=i,sy=j;
else if(f[i][j]=='G') ex=i,ey=j;//记下起点终点
}
}
memset(v,0,sizeof(v));
bfs();
if(num!=0) printf("%d\n",num);
else printf("Please give me another chance!\n");
}
return 0;
}
HDU2579 BFS迷宫里的障碍会在K的整数倍时间时消失
最新推荐文章于 2022-04-28 09:22:59 发布
该博客主要讨论了一种基于BFS的迷宫寻路算法,用于解决从起点到终点的最短路径问题。在迷宫中,某些位置的石头会在特定时间间隔k消失,算法通过三维数组记录每个位置的状态。程序接收迷宫的尺寸、石头消失的步数k以及起点和终点的位置,然后通过广度优先搜索找到最短路径。如果找不到路径,则输出提示信息。
摘要由CSDN通过智能技术生成