考虑贪心。
遍历每只奶牛:
- 如果它最多与一头奶牛相邻,那么什么都不会发生。
- 如果它与两头以上的奶牛相邻,那么它与两侧的两头奶牛相邻。将答案递增 \(1\)。
- 否则,如果正好有两头相邻的奶牛,我们就把它们配对。也就是说,将这对奶牛插入一组。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[1010][1010];
const int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
int main(){
scanf("%d%d",&n,&m);
map<vector<pair<int,int>>,int> p;
for(int i=1;i<=n;i++)scanf("%s",a[i]+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!='G') continue;
vector<pair<int,int>>v;
for(int d=0;d<4;d++){
int x=i+dx[d],y=j+dy[d];
if(a[x][y]=='C')v.push_back({x, y});
}
if(v.size()<2)continue;
if(v.size()>2)ans++;
if(v.size()==2){
if(v[0]>v[1])swap(v[0],v[1]);
p[v]=1;
}
}
}
printf("%d",ans+p.size());
return 0;
}
标签:P9939,int,题解,相邻,ans,两头,奶牛,III
From: https://www.cnblogs.com/cly312/p/18444918