题目
分析
代码
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<vector>
5 using namespace std;
6 long long n,m,x,y,ans,link[100001],s[205][205],p,ss;
7 vector<int> f[10001];
8 bool cover[100001];
9 int map[100][100],rk[100][100];
10 bool find(int i)
11 {
12 for (int k=0;k<f[i].size();k++)
13 if (!cover[f[i][k]])
14 {
15 int j=f[i][k];
16 cover[j]=true;
17 int q=link[j];
18 link[j]=i;
19 if (q==0||find(q)) return true;
20 link[j]=q;
21 }
22 return false;
23 }
24 int main()
25 {
26 int n,m,r,c;
27 cin>>n>>m>>r>>c;
28 char num;
29 int fx[4][2]={{r,c},{c,r},{r,-c},{c,-r}};
30 int cnt=0,tot=0;
31 for (int i=1;i<=n;i++)
32 for (int j=1;j<=m;j++)
33 {
34 cin>>num;
35 if (num=='.') map[i][j]=1,rk[i][j]=++cnt;
36 else tot++;
37 }
38 for (int i=1;i<=n;i++)
39 for (int j=1;j<=m;j++)
40 for (int k=0;k<4;k++)
41 {
42 int ax=i+fx[k][0],ay=j+fx[k][1];
43 if (ax>n||ay>m||ax<1||ay<1||!map[ax][ay]) continue;
44 f[rk[i][j]].push_back(rk[ax][ay]);
45 }
46 int ans=0;
47 for (int i=1;i<=n;i++)
48 {
49 for (int j=1;j<=m;j++)
50 {
51 if (map[i][j]==1)
52 {
53 memset(cover,0,sizeof(cover));
54 ans+=find(rk[i][j]);
55 }
56 }
57 }
58 cout<<n*m-tot-ans;
59 }