Dating with girls(2)
The Maze is very strange. There are many stones in the maze. The stone will disappear at time t if t is a multiple of k(2<= k <= 10), on the other time , stones will be still there.
There are only ‘.’ or ‘#’, ’Y’, ’G’ on the map of the maze. ’.’ indicates the blank which you can move on, ‘#’ indicates stones. ’Y’ indicates the your location. ‘G’ indicates the girl's location . There is only one ‘Y’ and one ‘G’. Every seconds you can move left, right, up or down.
The next r line is the map’s description.
1 6 6 2 ...Y.. ...#.. .#.... ...#.. ...#.. ..#G#.
7
这个题就是一个普通的bfs,但是要注意一点,在一定的时刻,障碍物是会消失的,这样一来,我们有些点可以走多次,每次取余k值不同是就是不同的状态,这时候,是可以重复走的,所以要用到三维数组记录!
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int m,n,k,bx,by,ex,ey;
char map[110][110];
int vis[110][110][11],mov[4][2]={0,1,0,-1,-1,0,1,0};
struct node{
int x,y,step;
}ta,tb;
queue<node>q;
bool can(node x,node y)
{
if((x.step+1)%k==0&&y.x>=0&&y.x<m&&y.y>=0&&y.y<n&&!vis[y.x][y.y][(x.step+1)%k])
return true;
if(y.x>=0&&y.y>=0&&y.x<m&&y.y<n&&!vis[y.x][y.y][(x.step+1)%k]&&map[y.x][y.y]!='#')
return true;
return false;
}
int bfs(int x,int y)
{
int i;
while(!q.empty())
q.pop();
ta.x=x;
ta.y=y;
ta.step=0;
q.push(ta);
while(!q.empty())
{
ta=q.front();
q.pop();
if(ta.x==ex&&ta.y==ey)
return ta.step;
for(i=0;i<4;i++)
{
tb.x=ta.x+mov[i][0];
tb.y=ta.y+mov[i][1];
if(can(ta,tb))
{
vis[tb.x][tb.y][(ta.step+1)%k]=1;
tb.step=ta.step+1;
q.push(tb);
}
}
}
return -1;
}
int main()
{
int N,i,j;
scanf("%d",&N);
while(N--)
{
scanf("%d%d%d",&m,&n,&k);
for(i=0;i<m;i++)
{
scanf("%s",map[i]);
for(j=0;j<n;j++)
{
if(map[i][j]=='Y')
{
bx=i;
by=j;
}
if(map[i][j]=='G')
{
ex=i;
ey=j;
}
}
}
memset(vis,0,sizeof(vis));
vis[bx][by][0]=1;
int t=bfs(bx,by);
if(t==-1)
printf("Please give me another chance!\n");
else
printf("%d\n",t);
}
return 0;
}
1915



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



