90pts求助
查看原帖
90pts求助
748509
2huk楼主2023/5/12 11:10

rt,照第2篇题解写的。

#include <iostream>
#include <cstring>

using namespace std;

#define int long long
#define fi first
#define se second

typedef pair<int, int> PII;

const int N = 1010;

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

int n, m, r, c, res;
char g[N][N];
int h[N], e[N], ne[N], idx;
bool st[N];
int match[N];

bool dfs(int u)
{
	for (int i = h[u]; ~i; i = ne[i])
	{
		int j = e[i];
		if (st[j]) continue;
		st[j] = true;
		if (!match[j] || dfs(match[j]))
		{
			match[j] = u;
			return true;
		}
	}
	return false;
}

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

signed main()
{
	memset(h, -1, sizeof h);
	
	n = read(), m = read(), r = read(), c = read();

	int dx[] = {r, r, c, c}, dy[] = {-c, c, -r, r};
	
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= m; j ++ )
			cin >> g[i][j];
	
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= m; j ++ )
			if (g[i][j] == '.') 
				for (int k = 0; k < 4; k ++ )
				{
					int x = i + dx[k], y = j + dy[k];
					if (x >= 1 && x <= n && y >= 1 && y <= m && g[x][y] == '.')
					{
						add((i - 1) * m + j, (x - 1) * m + y);
						//cout << (i - 1) * m + j << ' ' << (x - 1) * m + y << '\n';
					}
				}
	
	int s = 0;
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= m; j ++ )
			if (g[i][j] == '.')
			{
				s ++ ;
				memset(st, 0, sizeof st);
				res += dfs((i - 1) * m + j);
			}
	
	res = s - res;
	cout << res;
	
	return 0;
}
2023/5/12 11:10
加载中...