加农是罪的化身,所到之处污秽遍地。原先富丽堂皇的海鲁拉城堡也被加农污秽了。
根据调查,加农污秽一片地区有如下规律:
下图是一个矩形区域,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; }
标签:cnt,const,int,路径,BFS,区域,include,加农 From: https://www.cnblogs.com/weinan030416/p/17090719.html