Problem E. 逃离机场

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!”(不含引号)。
 

Input
多组测试数据,首先第一行一个整数T,代表测试数据组数。1≤T≤100。
每组测试数据有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;
}


猜你喜欢

转载自blog.csdn.net/qibage/article/details/81053179