1. 程式人生 > 實用技巧 >【AtCoder】AtCoder Grand Contest 033 解題報告($A$)

【AtCoder】AtCoder Grand Contest 033 解題報告($A$)

點此進入比賽

前言

又是一場過去的\(AtCoder\)

一邊希望著題目不會太難,一邊卻又希望題目能有足夠的難度,讓我從中學到更多。

\(A\):Darker and Darker(點此看題面

大致題意: 給定一個\(n\times m\)的矩形,上面有一些黑格子。每個時刻所有與黑格子有邊相鄰的白格子會被染黑,問多久以後所有格子被染黑。

顯然的\(BFS\),甚至可以算作\(BFS\)的板子,不加贅述了。

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000
using namespace std;
const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//四個方向
int n,m,vis[N+5][N+5];char s[N+5][N+5];struct Data {int x,y,t;}q[N*N+5];
int main()
{
	RI i,j,H=1,T=0;for(scanf("%d%d",&n,&m),i=1;i<=n;++i)
		for(scanf("%s",s[i]+1),j=1;j<=m;++j) s[i][j]=='#'&&(q[++T]=(Data){i,j,0},vis[i][j]=1);//初始化佇列
	Data k;RI nx,ny;W(H<=T) for(k=q[H++],i=0;i^4;++i) (nx=k.x+dx[i])&&nx<=n&&//BFS
		(ny=k.y+dy[i])&&ny<=m&&!vis[nx][ny]&&(q[++T]=(Data){nx,ny,k.t+1},vis[nx][ny]=1);//擴充套件
	return printf("%d\n",q[T].t),0;//輸出最後一個格子被染黑的時間
}