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;
}