@lychee123
2017-03-18T21:44:47.000000Z
字数 1367
阅读 1053
BFS
题意
男孩子Y要找女孩子G约会,其中会有石头和平地,当所用时间为k的倍数时石头变为平地是可以走的,如果能够找到女孩,输出最短时间,否则输出"Please give me another chance!"
我们可以直接看样例Sample Input
1 ///代表测试数据组数
6 6 2 ///6*6的矩阵其中k=2
...Y..
...#..
.#....
...#..
...#..
..#G#.Sample Output
7
代码
#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
int i,j,l,dir[4][2]={1,0,-1,0,0,1,0,-1},vis[111][111][20],t,r,c,k,x,y,ex,ey,xx,yy;
char a[111][111];
struct node
{
int x,y,time;
};
void BFS()
{
queue<node>q;
node now,next;
now.x=x;
now.y=y;
now.time=0;
q.push(now);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
for(l=0;l<=k;l++)
vis[i][j][l]=1000000000;
vis[x][y][0]=0;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==ex&&now.y==ey)
{
printf("%d\n",now.time);
return;
}
for(i=0;i<4;i++)
{
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
if(next.x<1||next.x>r||next.y<1||next.y>c)
continue;
next.time=now.time+1;
if(a[next.x][next.y]!='#'&&vis[next.x][next.y][next.time%k]>next.time)
{
vis[next.x][next.y][next.time%k]=next.time;
q.push(next);
continue;
}
if(a[next.x][next.y]=='#'&&next.time%k==0&&vis[next.x][next.y][next.time%k]>next.time)
{
vis[next.x][next.y][next.time%k]=next.time;
q.push(next);
}
}
}
printf("Please give me another chance!\n");
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&r,&c,&k);
for(i=1;i<=r;i++)
{
scanf("%s",&a[i][1]);
for(j=1;j<=c;j++)
{
if(a[i][j]=='Y')
{
x=i;
y=j;
}
if(a[i][j]=='G')
{
ex=i;
ey=j;
}
}
}
BFS();
}
return 0;
}