Description龙神觉得无聊于是来到了地下城,这里是一个巨大的迷宫,有一些可以通行的路、一些不可以通行的墙,还有一些怪物。虽然龙神可以轻易地干掉这些怪物,但他觉得这样就太没意思了,他观察到这些怪物每 秒会消失一次(例如 时,则第 秒怪物是消失的),每一秒龙神可以选择向上下左右行走一步(不能在原地不动)。龙神想知道在避开全部怪物的条件下,到达出口所需要的最短时间。Input第一行输入一个整数 ,代表用例组数。每组用例的第一行包括三个整数 和 , 分别表示地下城迷宫的行数、列数、怪物的消失间隔。接下来的 行代表迷宫,.表示可以通行的路,#表示墙,*表示怪物,S表示起点,E代表出口。Output输出一个整数,表示龙神走出地下城迷宫的最短时间,如果龙神不能走出迷宫则输出-1。SourceBITACM2018第一轮积分赛(三)- Problem J
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 153600KB | 0 |
#include<stdio.h>
#include<string.h>
#define N 102
int n,m,k;
int visited[N][N][51];
char mg[N][N];
struct Queue{
int zb[N*N*30][2];
int time[N*N*30];
int front;
int rear;
}queue;
void init(){
memset(queue.zb,-1,sizeof(queue.zb));
memset(queue.time,0,sizeof(queue.time));
memset(visited,0,sizeof(visited));
queue.front=0;
queue.rear=0;
}
void push(int i,int j,int t)
{
queue.zb[queue.rear][0]=i;
queue.zb[queue.rear][1]=j;
queue.time[queue.rear]=t;
queue.rear++;
}
int pop()
{
return queue.front++;
}
int isOK(int i,int j,int t)
{
if(i>=0 && i<n && j>=0 && j<m)
if(mg[i][j]=='E') return 1;
else if(mg[i][j]=='.' || mg[i][j]=='*' && t%k==0)
if(visited[i][j][t%k]==0){
push(i,j,t);
visited[i][j][t%k]=1;
}
return 0;
}
main()
{
int t,i,j,s[2];
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&n,&m,&k);
memset(mg,0,sizeof(mg));
for(i=0;i<n;i++){
scanf("%s",mg[i]);
char *p=strchr(mg[i],'S');
if(p!=NULL){
s[0]=i;
s[1]=p-mg[i];
}
}
mg[s[0]][s[1]]='.';
visited[s[0]][s[1]][0]=1;
init();
push(s[0],s[1],0);
while(1){
int last=pop();
// if(queue.zb[last][0]==n-1 && queue.zb[last][1]==e){
// printf("%d\n",queue.time[last]);
// return 0;
// }
if(queue.zb[last][0]==-1){
printf("-1\n");
break;
}
int a=isOK(queue.zb[last][0]+1,queue.zb[last][1],queue.time[last]+1);
int b=isOK(queue.zb[last][0]-1,queue.zb[last][1],queue.time[last]+1);
int c=isOK(queue.zb[last][0],queue.zb[last][1]+1,queue.time[last]+1);
int d=isOK(queue.zb[last][0],queue.zb[last][1]-1,queue.time[last]+1);
if(a||b||c||d){
printf("%d\n",queue.time[last]+1);
break;
}
}
}
}