题目描述
小明听说机场是一个很肥的地方,所以想跳一波机场,看看到底有多肥。不过机场虽然肥,但是跳的人也多。小明第一次跳机场,刚跳下来就到处都是枪声,小明吓得快要哭出来了,想逃离机场,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.
题目思路:1.只要小明落在敌人上下左右任意一个方向都会死。因此先对敌人四个方向进行“#“填充,填充过程一旦遇到小明,则游戏结束2.对小明位置展开BFS,寻找最短路径。
代码如下:
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct node
{
int x;
int y;
int step;
};
node s;
char mapp[500][500];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
void book(int x,int y,int &flag)
{
mapp[x][y]='#';
//该点以下填充
for(int i=x+1;i<n;i++)
{
if(mapp[i][y]!='.')
{
if(mapp[i][y]=='@')flag=1;
else if(mapp[i][y]=='#')continue;
break;
}
else if(mapp[i][y]=='.')
mapp[i][y]='#';
}
//该点以上填充
for(int i=x-1;i>=0;i--)
{
if(mapp[i][y]!='.')
{
if(mapp[i][y]=='@')flag=1;
else if(mapp[i][y]=='#')continue;
break;
}
else if(mapp[i][y]=='.')
mapp[i][y]='#';
}
//该点以左填充
for(int i=y-1;y>=0;y--)
{
if(mapp[x][i]!='.')
{
if(mapp[x][i]=='@')flag=1;
else if(mapp[x][i]=='#')continue;
break;
}
else if(mapp[x][i]=='.')
mapp[x][i]='#';
}
//该点以右填充
for(int i=y+1;i<m;i++)
{
if(mapp[x][i]==!='.')
{
if(mapp[x][i]=='@')flag=1;
else if(mapp[x][i]=='#')continue;
break;
}
else if(mapp[x][i]=='.')
mapp[x][i]='#';
}
}
int bfs(node s1)
{
queue<node> temp;
node u1,t1;
mapp[s1.x][s1.y]='X';
temp.push(s1);
while(!temp.empty())
{
u1=temp.front();
temp.pop();
if(u1.x+1>=n||u1.x-1<0||u1.y+1>=m||u1.y-1<0)
return 1+u1.step;
for(int i=0;i<4;i++)
{
t1.x=u1.x+dir[i][0];
t1.y=u1.y+dir[i][1];
if(mapp[t1.x][t1.y]=='.')
{
t1.step=u1.step+1;
mapp[t1.x][t1.y]='X';
temp.push(t1);
}
}
}
return -1;
}
int main()
{
int N;
while(cin>>N)
{
while(N--)
{
int flag=0;
cin>>n>>m;
for(int i=0;i<n;i++)
scanf("%s",mapp[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mapp[i][j]=='@')
{
s.x=i;
s.y=j;
s.setp=0;
}
else if(mapp[i][j]=='o')
{
book(i,j,flag);
}
}
}
if(flag==1)cout<<"no zuo no die!"<<endl;
else
{
int sum;
sum=bfs(s);
if(sum==(-1))
cout<<"no zuo no die!"<<endl;
else
cout<<sum<<endl;
}
}
}
return 0;
}