此代码中共有三个函数也分为三个步骤,一个是b函数用来判断当前格子周围的八连通中雷的数量,当然如果当前格子是雷就跳过,c函数用于计算当前格子是否满足3bv的条件,如果满足,则ans++,还有就是如果是空格,则用一个bfs函数将与其联通的八连通的vis都变为1,代表已经访问过,说明他们是一个空,防止重复计算。
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[1005][1005];
bool p[1005][1005];
int ans;
int vis[1005][1005];
struct point{
int x, y;
};
int dx[8]={-1,-1,-1,0,0,1,1,1},dy[8]={-1,0,1,-1,1,-1,0,1};
void bfs(int x, int y)
{
queue<point> q;
q.push({x, y});
while (!q.empty()) {
point f = q.front();
q.pop();
vis[f.x][f.y] = 1;
for (int k = 0; k < 8; ++k) {
int x1 = f.x + dx[k], y1 = f.y + dy[k];
if (x1 > 0 && x1 <= n && y1 > 0 && y1 <= m)
{
if (vis[x1][y1] == 0) // 没有被访问过
{
if (a[x1][y1] == 0) // 并且是空格
{
vis[x1][y1] = 1;
q.push({x1,y1});
}
P4961 小埋与扫雷(bfs解法)
最新推荐文章于 2025-02-15 14:40:28 发布

1095

被折叠的 条评论
为什么被折叠?



