简单的多路广搜。
将最初病菌放入队列,之后依次出列,判断其向外蔓延的格子是否可以被病菌覆盖,可以被覆盖将其放入队列,否则不做操作。
代码:
void solve() {
int n,m; cin>>n>>m;
// 按 从 0 到 n-1 进行建图
vector<vector<int>> ph(n, vector<int>(n)), vis(ph);
queue<PII> q; // pair<int,int> ==> x,y
rep(i,1,m) {
int tx,ty; cin>>tx>>ty;
tx--,ty--;
vis[tx][ty] = 1;
q.push({tx,ty});
}
// 方向
vector<int> fx({1,-1,0,0}), fy({0,0,1,-1});
// 判断是否这个格子有两个以上相邻的病菌格子
auto check = [&](int x,int y) -> bool {
int cnt = 0;
rep(i,0,3) {
int xx = x + fx[i], yy = y + fy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= n) continue;
if(vis[xx][yy]) cnt++;
}
return cnt >= 2;
};
// bfs
while(q.size()) {
auto tmp = q.front(); q.pop();
int x = tmp.vf, y = tmp.vs;
rep(i,0,3) {
int xx = x + fx[i], yy = y + fy[i];
if(xx < 0 || xx >= n || yy < 0 || yy >= n) continue;
if(vis[xx][yy]) continue;
if(check(xx,yy)) {
vis[xx][yy] = 1;
q.push({xx,yy});
}
}
}
bool fg = false;
rep(i,0,n-1) {
rep(j,0,n-1) {
if(vis[i][j] == 0) fg = true;
}
}
puts(!fg ? "YES" : "NO");
}