Darker and Darker
- 题目描述:给一个图,图中#代表黑色,.代表白色。#可以对上下左右的白色进行染色,求需要多少次。
测试数据:
![]()
这题就是bfs()的应用,但这和平时的bfs()有所差距,平时的bfs()是从第0层为一个引出多个,但这题第0层有多个,那我们就可以假设它从-1层开始
所以最开始的操作我们就要将#的位置直接输入到队列进去,将第0层补完。接着就是正常的bfs()
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2000;
int h,w;
char a[N][N];
int va[N][N];//用来存某个点要到的次数
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//4个方向
struct pro{
int x,y;
};
bool bro(int x,int y)
{
return x>=1&&x<=h&&y>=1&&y<=w;
}//边界的判定
queue<pro>p;
int bfs()
{
int maxn=0;
while(!p.empty())
{
pro cur=p.front();
p.pop();
for(int i=0;i<4;i++)
{
int xx=cur.x+dir[i][0];
int yy=cur.y+dir[i][1];
if(bro(xx,yy)&&va[xx][yy]==-1)
{
va[xx][yy]=va[cur.x][cur.y]+1;
maxn=max(va[xx][yy],maxn);
p.push({xx,yy});
}
}
}
return maxn;
}
int main()
{
memset(va,-1,sizeof(va));
cin>>h>>w;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=w;j++)
{
cin>>a[i][j];
if(a[i][j]=='#')
{
p.push({i,j});
va[i][j]=0;
}
//第0层的存入
}
}
cout<<bfs()<<endl;
return 0;
}

浙公网安备 33010602011771号