weinan030416

导航

BFS求最短路径

 加农是罪的化身,所到之处污秽遍地。原先富丽堂皇的海鲁拉城堡也被加农污秽了。

根据调查,加农污秽一片地区有如下规律:

下图是一个矩形区域,Y=3,X=4。

 

"."表示干净区域,而"*"表示障碍物。

如果加农一开始在左下角(1,1),那么加农将会以如下态势污染区域:

 

加农将在4天后污染整个区域。

设区域为矩形Y×X(1<=Y,X<=100),假设加农从(Mx,My)开始扩散,请问经过几天,加农会完全占据这个区域呢?

 

输入

 

* 第一行: 四个由空格隔开的整数: X, Y, Mx, My

* 第2到第Y+1行:每行包含一个由X个字符("."表示干净区域,而"*"表示障碍物。)构成的字符串,共同描绘了草地的完整地图。

(1≤X,Y≤100)

 

输出

 

输出一个整数,表示加农完全占领该区域所需要的天数。

 

输入样例 1 

4 3 1 1
....
..*.
.**.

输出样例 1

4
#include<iostream>
#include<cstring>
#include<queue>
#include<utility>
#include<bits/stdc++.h>
using namespace std;

const int dx[8]={1,-1,0,0,1,-1,1,-1};
const int dy[8]={0,0,1,-1,1,-1,-1,1};
const int N=100;
char s[N][N];
int cnt,n,m;
int visited[N][N],dist[N][N],maxdist;
#define pii pair<int,int>
#define For(i,a,b)    for(int i=a;i<b;i++)
pii start,qhead;
queue<pii> q;

int check(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m&&visited[x][y]==0&&s[x][y]!='*';
}

int bfs()
{
    q.push(start);
    dist[start.first][start.second]=0;
    visited[start.first][start.second]=1;
    while(q.size())
    {
        qhead=q.front();
        q.pop();
        For(i,0,8)
        {
            int x=qhead.first+dx[i],y=qhead.second+dy[i];
            if(check(x,y))
            {
                cnt--;
                visited[x][y]=1;
                dist[x][y]=dist[qhead.first][qhead.second]+1;
                maxdist=max(maxdist,dist[x][y]);
                q.push(make_pair(x,y));
                if(cnt==0)
                return 1;
            }
        }
    }
}

int main()
{
    
    scanf("%d%d%d%d\n",&m,&n,&start.second,&start.first); 
    char c;
    for(int i=n;i>=1;i--)
    {
        for(int j=1;j<=m;j++)
        {
            
            cin>>c;
            s[i][j]=c;
            if(c=='.')
                cnt++;
        }
    }
    if(s[start.first][start.second]=='.')
        cnt--;
    bfs();
    cout<<maxdist;
    
}

 

posted on 2023-02-03 23:33  楠030416  阅读(74)  评论(0编辑  收藏  举报