更暗更暗了bfs()

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;
}
posted on 2024-03-08 16:10  咋瓦鲁多_食我压路机  阅读(10)  评论(0)    收藏  举报