Dating with girls(2)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2821 Accepted Submission(s): 791
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#.
Sample Output
7
个人版本的全文翻译(提供给英语不好的小伙伴和一些非英语考生0.0):
如果你解决了Dating with girls(1).辣么我觉得你也可以解决这个问题。这个问题也是关于约妹纸。现在你在一个迷宫里并且有一个妹纸你想要约,如果你可以找到妹纸,那么你就可以约她,否则她就会约其他的男孩,多么蛋疼。。。
这个迷宫是非常奇怪的,迷宫里有很多石头。这些石头会在t时刻消失,t的定义是k的倍数,在其他时候石头是依然存在的.
这里保证只有. # Y G几种字符在迷宫的地图中,.只带你可以直接走的到地方,#表示石头,Y表示你的初始位子,G表示妹纸,保证只有一个Y和一个G,每一秒你可以向左走,向右走,向上走,或者向下走(翻译到这里大家应该懂了,不会有原地不动的情况哦~~~~~~)
思路:
因为有很多点可以重复走,所以我们要开三维数组vis【】【】【】来判重,如果一维用来表示x,一维用来表示y,那么另外一维用来表示什么呢?当然是走的步数了,但是我们不知道一共最多能走多少步啊~所以我们这里对k进行求余,只要是不为0,都表示石头存在。剩下的部分直接BFS不要怂就好。
注意的点:
可以直接走的点有: G Y 和 “。”这里我第一发交的时候忘记了Y这个地方也可以重复走,所以WA了一发。
间接能走的点有:# 即当前步数%k==0的时候可以走。
最后提供两组可能用的上的数据:
2
2 3 9
##.
G#Y
2 4 4
Y.#G
#.##
AC代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct zuobiao
{
int x,y,output;
}now,nex;
int fx[4]={0,0,1,-1};
int fy[4]={1,-1,0,0};
char a[105][105];
int vis[105][105][12];
int n,m,k;
void bfs(int x,int y)
{
memset(vis,0,sizeof(vis));
now.x=x;
now.y=y;
now.output=0;
vis[x][y][0]=1;
queue<zuobiao >s;
s.push(now);
while(!s.empty())
{
now=s.front();
if(a[now.x][now.y]=='G')
{
printf("%d\n",now.output);
return ;
}
s.pop();
for(int i=0;i<4;i++)
{
nex.x=now.x+fx[i];
nex.y=now.y+fy[i];
nex.output=now.output+1;
//printf("%d %d %d %d %d\n",nex.x,nex.y,nex.output,nex.output%k,vis[nex.x][nex.y][nex.output%k]);
if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&vis[nex.x][nex.y][nex.output%k]==0)
{
if(a[nex.x][nex.y]=='.'||a[nex.x][nex.y]=='G'||a[nex.x][nex.y]=='Y')
{
//printf("yes\n");
vis[nex.x][nex.y][nex.output%k]=1;
s.push(nex);
}
if(a[nex.x][nex.y]=='#'&&nex.output%k==0)
{
//printf("yes\n");
vis[nex.x][nex.y][nex.output%k]=1;
s.push(nex);
}
}
}
}
printf("Please give me another chance!\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int sx,sy;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
for(int j=0;j<m;j++)
{
if(a[i][j]=='Y')
{
sx=i;
sy=j;
}
}
}
bfs(sx,sy);
}
}