问题 C: 逃离机场

廉价感情. 提交于 2020-02-18 02:03:34

题目描述

小明听说机场是一个很肥的地方,所以想跳一波机场,看看到底有多肥。不过机场虽然肥,但是跳的人也多。小明第一次跳机场,刚跳下来就到处都是枪声,小明吓得快要哭出来了,想逃离机场,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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!