求助
查看原帖
求助
998963
封禁用户楼主2024/10/29 18:52

题目

20pts求调

用dfs样例过了,提交wa了一片

#include <iostream>
using namespace std;
int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
int g[1010][1010], bv3, lt, n, m;
bool vis[1010][1010];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		x = x * 10 + ch - '0';
		ch = getchar(); 
	}
	return x * f;
}

void dfs(int x, int y)
{
	for (int i = 0; i < 8; i ++)
	{
		int nx = x + dx[i], ny = y + dy[i];
		if (nx >= 0 && nx <= n && ny >= 0 && ny <= m && g[nx][ny] == 0 && !vis[nx][ny])
		{
			vis[nx][ny] = true;
			dfs(nx, ny);	
		}
	}
}

void b(int a, int b)
{
	for (int  i = 0; i < 8; i ++)
	{
		int tx = a + dx[i];
		int ty = b + dy[i];
		if (tx >= 0 && tx <= n && ty >= 0 && ty <= m && g[tx][ty] != -1) g[tx][ty] ++;
	}
}

int iff(int c, int d)
{
	for (int i = 0; i < 8; i ++)
	{
		int mx = c + dx[i];
		int my = d + dy[i];
		if (mx >= 0 && mx <= n && my >= 0 && my <= m && g[mx][my] == 0) return 0;
	}
	return 1;
}

int main()
{
	n = read(), m = read();
	for (int i = 0; i < n; i ++)
	{
		for (int j = 0; j < m; j ++)
		{
			g[i][j] = read();
			if (g[i][j] == 1) g[i][j] = -1;
		}
	}
	for (int i = 0; i < n; i ++)
	{
		for (int j = 0; j < m; j ++)
		{
			if (g[i][j] == -1) b(i, j);
		}
	}
	for (int i = 0; i < n; i ++)
	{
		for (int j = 0; j < m; j ++)
		{
			if (g[i][j] != 0 && g[i][j] != -1 && iff(i, j)) bv3 ++;
		}
	}
	for (int i = 0; i < n; i ++)
	{
		for (int j = 0; j < m; j ++)
		{
			if (g[i][j] == 0 && !vis[i][j]) {
				lt ++;
				dfs(i, j);
			}
		}
	}
	bv3 += lt;
	cout << bv3;
	return 0;
}
2024/10/29 18:52
加载中...