题解:https://blog.csdn.net/hnust_xiehonghao/article/details/9018463
思路来源上一篇题解,除了变量名不同、多写了一个函数之外没有什么不同。
具体请见上面这篇题解
解题关键,visit[][][]三维判断是否可以走这个点。时间周期是k,那么到达该点会有k种不同的状态
以不同状态访问该点是不一样的,所以要三维判断是否重复。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define maxn 100
char map1[maxn+10][maxn+10];
int visit[maxn+10][maxn+10][11];
//int answer;
int r,c,k;
int zx[]={0,0,-1,1};
int zy[]={-1,1,0,0};
struct zuobiao
{
int x;
int y;
int time;
}you,girl;
bool judge(zuobiao p)
{
if(p.x>=0&&p.x<r&&p.y>=0&&p.y<c&&!visit[p.x][p.y][p.time%k])
{
if(map1[p.x][p.y]=='#')
{
if(p.time%k==0)
return true;
else
return false;
}
else
return true;
}
else
return false;
}
void bfs(zuobiao f,zuobiao g)
{
queue<zuobiao>q;
f.time=0;
q.push(f);
visit[f.x][f.y][0]=1;
while(!q.empty())
{
f=q.front();
q.pop();
zuobiao lu;
for(int i=0;i<4;i++)
{
lu=f;
lu.x+=zx[i];
lu.y+=zy[i];
lu.time++;
if(judge(lu))
{
q.push(lu);
visit[lu.x][lu.y][lu.time%k]=1;
//pre[lu.x][lu.y]=f;
if(lu.x==g.x&&lu.y==g.y)
{
printf("%d\n",lu.time);
return ;
}
}
}
if(q.empty())
printf("Please give me another chance!\n");
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
//memset(map1,'\0',sizeof(map1));
memset(visit,0,sizeof(visit));
//answer=0x7FFFFFFF;
char s;
scanf("%d %d %d",&r,&c,&k);
for(int i=0;i<r;i++)
{
scanf("%c",&s);
for(int j=0;j<c;j++)
{
scanf("%c",&map1[i][j]);
if(map1[i][j]=='Y')
{
you.x=i;
you.y=j;
}
else if(map1[i][j]=='G')
{
girl.x=i;
girl.y=j;
}
}
}
visit[you.x][you.y][0]=1;
bfs(you,girl);
}
return 0;
}