水灾

大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。

CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。

CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。

求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。

输入文件 sliker.in

输出文件 sliker.out

Input

3 3

D.*

.S.

Output

3

Input

3 3

D.*

..S

Output

ORZ hzwer!!!

Input

3 6

D…*.

.X.X..

….S.

Output

6

 思路:

  暴力bfs强行ac

来,上代码:

#include<map>
#include<queue>
#include<cstdio>

using namespace std;

const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};

struct node {
    int x,y,now;
};
struct node cur_1,cur_2,cur_3;

int n,m,imap[51][51],sx,sy,ex,ey,ans;

char cmap[51][51];

bool pd[51][51],if_all;

queue<struct node>que;

void make_water()
{
    int now_1=2;
    while(now_1<200)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(imap[i][j]>0&&imap[i][j]<now_1)
                {
                    for(int v=1;v<=4;v++)
                    {
                        if(i+dx[v]<=n&&i+dx[v]>0&&j+dy[v]<=m&&j+dy[v]>0)
                        {
                            if(imap[i+dx[v]][j+dy[v]]==0)
                            {
                                imap[i+dx[v]][j+dy[v]]=now_1;
                            }
                        }
                    }
                }
            }
        }
        now_1++;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) if(imap[i][j]==0) imap[i][j]=3000;
    }
}

void bfs()
{
    cur_1.x=sx,cur_1.y=sy,cur_1.now=1;
    pd[sx][sy]=true;
    que.push(cur_1);
    while(!que.empty())
    {
        cur_1=que.front();
        que.pop();
        //printf("%d %d %d
",cur_1.x,cur_1.y,cur_1.now);
        for(int i=1;i<=4;i++)
        {
            if(cur_1.x+dx[i]>0&&cur_1.y+dy[i]>0&&cur_1.x+dx[i]<=n&&cur_1.y+dy[i]<=m)
            {
                if(ex==cur_1.x+dx[i]&&ey==cur_1.y+dy[i]&&cur_1.now<imap[cur_1.x][cur_1.y])
                {
                    ans=cur_1.now;
                    if_all=true;
                }
                if(if_all) break;
                if(imap[cur_1.x+dx[i]][cur_1.y+dy[i]]>cur_1.now&&!pd[cur_1.x+dx[i]][cur_1.y+dy[i]])
                {
                    pd[cur_1.x+dx[i]][cur_1.y+dy[i]]=true;
                    cur_2.x=cur_1.x+dx[i];
                    cur_2.y=cur_1.y+dy[i];
                    cur_2.now=cur_1.now+1;
                    que.push(cur_2);
                }
            }
        }
        if(if_all) break;
    }
    if(if_all) printf("%d
",ans);
    else printf("ORZ hzwer!!!
");
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",cmap[i]+1);
        for(int j=1;j<=m;j++)
        {
            if(cmap[i][j]=='D') ex=i,ey=j,imap[i][j]=-2;
            if(cmap[i][j]=='S') sx=i,sy=j;
            if(cmap[i][j]=='X') imap[i][j]=-1;
            if(cmap[i][j]=='*') imap[i][j]=1;
        }
    }
    make_water();
    bfs();
    return 0;
}
原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6073439.html