Problem E. 逃离机场
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 296 Accepted Submission(s): 56
Problem Description
小明听说机场是一个很肥的地方,所以想跳一波机场,看看到底有多肥。不过机场虽然肥,但是跳的人也多。小明第一次跳机场,刚跳下来就到处都是枪声,小明吓得快要哭出来了,想逃离机场,emmm,还是打野比较适合他。
现在把机场看作一个二维平面,’.’ 代表可以走的空地,’@’代表小明当前的位置,’x’代表这里是个障碍物,’o’代表这里有个敌人,并且手里有枪,敌人可以攻击上下左右四个方向,小明只要走到或者一开始就在敌人可以攻击的位置,就会死亡(机场个个都是98K爆头dalao),子弹不会穿过障碍物,敌人不会移动。小明只能往上下左右走,每走一步需要1秒,只要小明移动到机场的边缘再走一步就算逃离了机场,现在小明请你帮他找一条最快逃离机场的线路,输出这个时间,如果怎么都逃不出去,输出”no zuo no die!”(不含引号)。
现在把机场看作一个二维平面,’.’ 代表可以走的空地,’@’代表小明当前的位置,’x’代表这里是个障碍物,’o’代表这里有个敌人,并且手里有枪,敌人可以攻击上下左右四个方向,小明只要走到或者一开始就在敌人可以攻击的位置,就会死亡(机场个个都是98K爆头dalao),子弹不会穿过障碍物,敌人不会移动。小明只能往上下左右走,每走一步需要1秒,只要小明移动到机场的边缘再走一步就算逃离了机场,现在小明请你帮他找一条最快逃离机场的线路,输出这个时间,如果怎么都逃不出去,输出”no zuo no die!”(不含引号)。
Input
多组测试数据,首先第一行一个整数T,代表测试数据组数。1≤T≤100。
每组测试数据有n,m(1≤n,m≤200),代表机场是一个n×m的方阵,接下来是一个由’.’,’@’,’x’,’o’构成的n×m的方阵,’@’只有一个。
每组测试数据有n,m(1≤n,m≤200),代表机场是一个n×m的方阵,接下来是一个由’.’,’@’,’x’,’o’构成的n×m的方阵,’@’只有一个。
Output
对于每组数据输出一个数代表最快需要多少时间逃出机场,或者”nozuonodie!”。
Sample Input
3 5 5 .x.x. .x.x. ..... ..@.. .o.o. 3 3 @.. xxx o.x 3 3 o.o .@. .x.
Sample Output
4 1 no zuo no die!
Source
陈都测试2
将所有不能走的-标记后bfs (dfs会超时)
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
char mp[210][210];
int n,m,book[210][210],sx,sy;
int ans=inf;
struct node{
int x,y;
};
int p(int x,int y){
if(book[x][y]==-1)return 0;
if(x<n&&x>=0&&y<m&&y>=0)return 1;
return 0;
}
void bfs(int x,int y)
{
int i,j,ans=inf;
int a[]={0,0,1,-1};
int b[]={1,-1,0,0};
queue <node> q;
node add;
add.x=x;add.y=y;
q.push(add);
while(!q.empty())
{
node aa;
aa.x=q.front().x;
aa.y=q.front().y;
q.pop();
for(i=0;i<4;i++)
{
add.x=aa.x+a[i];
add.y=aa.y+b[i];
if(p(add.x,add.y))
{
if(book[aa.x][aa.y]+1<book[add.x][add.y])
{
book[add.x][add.y]=book[aa.x][aa.y]+1;
q.push(add);
}
}
}
}
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",&mp[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
book[i][j]=inf;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(mp[i][j]=='@')
{
sx=i;sy=j;
}
else if(mp[i][j]=='x')
book[i][j]=-1;
else if(mp[i][j]=='o')
{
for(int g=i;g<n;g++)
if(mp[g][j]=='x')break;
else book[g][j]=-1;
for(int g=i;g>=0;g--)
if(mp[g][j]=='x')break;
else book[g][j]=-1;
for(int g=j;g<m;g++)
if(mp[i][g]=='x')break;
else book[i][g]=-1;
for(int g=j;g>=0;g--)
if(mp[i][g]=='x')break;
else book[i][g]=-1;
}
if(book[sx][sy]==-1)printf("no zuo no die!\n");
else
{
book[sx][sy]=0;
bfs(sx,sy);
ans=inf;
for(i=0;i<n;i++)
if(book[i][0]!=inf&&book[i][0]!=-1)
{ans=min(ans,book[i][0]);}
for(i=0;i<n;i++)
if(book[i][m-1]!=inf&&book[i][m-1]!=-1)
{ans=min(ans,book[i][m-1]);}
for(i=0;i<m;i++)
if(book[0][i]!=inf&&book[0][i]!=-1)
{ans=min(ans,book[0][i]);}
for(i=0;i<m;i++)
if(book[n-1][i]!=inf&&book[n-1][i]!=-1)
{ans=min(ans,book[n-1][i]);}
if(ans==inf)printf("no zuo no die!\n");
else printf("%d\n",ans+1);
}
}
return 0;
}