题解:P9939 [USACO21OPEN] Acowdemia III B
奶牛交友
思路整理:
题目给出了两头奶牛之间交友的条件,我们分两类讨论:
-
若两头奶牛在同一条直线上,且只间隔着一块草地,则它们可以见面。
-
若两头奶牛及一块草地呈现拐角状(如下图),也能够见面。
对于能见面的奶牛的搭配要求:
-
[ ] 一个见面位置最多只能供一组奶牛使用,即不能出现两组奶牛选择同一个位置作为见面地点。
-
[ ] 一组奶牛最多只能选择一个见面位置,也就是说如果有两个位置可以供这一组奶牛使用,它们也只能选择一个作为见面地点。
-
[ ] 一头奶牛可以和其他不同的奶牛在不同的位置见面。
通过以上的详细分析,写代码分分钟的事。
AC CODE:
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans;
char a[1005][1005];
int main(){
//可自行添加快读等。
cin>>n>>m;
for(int i=1;i<=n;i++){//以字符的形式读入。
for(int j=1;j<=m;j++)cin>>a[i][j];
}for(int i=1;i<=n;i++){//情况一。
for(int j=1;j<=m;j++){
if(a[i][j]=='G'){
if(a[i-1][j]=='C' && a[i+1][j]=='C')a[i][j]='.',ans++;
else if(a[i][j-1]=='C' && a[i][j+1]=='C')a[i][j]='.',ans++;
}
}
}for(int i=1;i<=n;i++){//情况二。
for(int j=1;j<=m;j++){
if(a[i][j]=='C' && a[i+1][j-1]=='C'){
if(a[i][j-1]=='G')a[i][j-1]='.',ans++;
else if(a[i+1][j]=='G')a[i+1][j]='.',ans++;
}if(a[i][j]=='C' && a[i+1][j+1]=='C'){//与上面的情况不排斥,不能加else。
if(a[i][j+1]=='G')a[i][j+1]='.',ans++;
else if(a[i+1][j]=='G')a[i+1][j]='.',ans++;
}
}
}
cout<<ans;//输出组成朋友的最大数量。
return 0;//好习惯。
}