问题 E: 逃离机场

 

内存限制:128 MB时间限制:1 S标准输入输出

 

 

题目描述

小明听说机场是一个很肥的地方,所以想跳一波机场,看看到底有多肥。不过机场虽然肥,但是跳的人也多。小明第一次跳机场,刚跳下来就到处都是枪声,小明吓得快要哭出来了,想逃离机场,emmm,还是打野比较适合他。
现在把机场看作一个二维平面,'.'代表可以走的空地,'@'代表小明当前的位置,'x'代表这里是个障碍物,'o'代表这里有个敌人,并且手里有枪,敌人可以攻击上下左右四个方向,小明只要走到或者一开始就在敌人可以攻击的位置,就会死亡(机场个个都是98K爆头dalao),子弹不会穿过障碍物,敌人不会移动。小明只能往上下左右走,每走一步需要1秒,只要小明移动到机场的边缘再走一步就算逃离了机场,现在小明请你帮他找一条最快逃离机场的线路,输出这个时间,如果怎么都逃不出去,输出"no zuo no die!"(不含引号)。

 

输入格式

多组测试数据,首先第一行一个整数T,代表测试数据组数。1≤T≤100。
每组测试数据有n,m(1≤n,m≤200),代表机场是一个n×m的方阵,接下来是一个由'.','@','x','o'构成的n×m的方阵,'@'只有一个。

 

输出格式

对于每组数据输出一个数代表最快需要多少时间逃出机场,或者"no zuo no die!"。

 

输入样例 复制

3
5 5
.x.x.
.x.x.
.....
..@..
.o.o.
3 3
@..
xxx
o.x
3 3
o.o
.@.

.x.

 

输出样例 复制

4
1
no zuo no die!

 

问题 E: 逃离机场_C语言

 

思路:BFS

 

代码:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct step
{
int r,c;
int time;
step(int a,int b, int cc):
r(a),c(b),time(cc){}
step(){};
};
queue <step> q;
int b[4][2] = {0,-1,0,1,1,0,-1,0};
step start;
int main()
{
int t;
while(cin>>t)
{
while(t--)
{
char s[210][210];
bool vis[210][210];
int n,m;
cin>>n>>m;
memset(s,'#',sizeof(s));
memset(vis,0,sizeof(vis));
while(!q.empty())
q.pop();
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>s[i][j];
if(s[i][j] == '@')
start = step(i,j,0);
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(s[i][j] == 'o')
{
for(int k=i;k>=1;k--)
{
if(s[k][j]=='x')
break;
if(s[k][j]=='.'||s[k][j]=='@')
s[k][j]='O';
}
for(int k=i;k<=n;k++)
{
if(s[k][j]=='x')
break;
if(s[k][j]=='.'||s[k][j]=='@')
s[k][j]='O';
}
for(int k=j;k>=1;k--)
{
if(s[i][k]=='x')
break;
if(s[i][k]=='.'||s[i][k]=='@')
s[i][k]='O';
}
for(int k=j;k<=m;k++)
{
if(s[i][k]=='x')
break;
if(s[i][k]=='.'||s[i][k]=='@')
s[i][k]='O';
}
}
}
}
bool flag = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(s[i][j] == '@')
flag = 1;
if(!flag)
{
cout<<"no zuo no die!"<<'\n';
continue ;
}
q.push(start);
vis[start.r][start.c] = 1;
step ps;
while(!q.empty())
{
ps = q.front();
if(s[ps.r][ps.c] == '#')
{
break;
}
q.pop();

for(int k=0; k<4; k++)
{
int r = ps.r + b[k][0], c = ps.c + b[k][1];
if(s[r][c] == 'o' || s[r][c] == 'O' || s[r][c] == 'x')
continue ;
if(!vis[r][c] )
{
q.push(step(r,c,ps.time+1));
vis[r][c] = 1;
}
}
}
if(q.empty())
cout<<"no zuo no die!"<<'\n';
else
cout<<ps.time<<'\n';
}
}
return 0;
}