P10122 [USACO18OPEN] Team Tic Tac Toe B 题解
2021zjhs005 · · 题解
这是一道强大的 if 语句题,难度大概为橙。
Despriction
给定一个
Solution
直接枚举每一行、每一列、每一对角线,然后判断即可。
这时因为大量重复代码不太美观,所以可以自定义一个
-
如果
a=b\ \Lambda\ a=c\ \Lambda\ b=c ,这时对答案一的贡献为1 。 -
如果
a,b,c 中有两个相等,那么对答案二的贡献为1 。
但是这题也有坑点,不仔细看清题目的可能会掉进去。
比如:
Input:
ABA
BAB
ABA
Output:
1
1
这是因为题目求的是不同的奶牛的数量,相同的可能会造成
开两个 map,第一个
第二个
判断条件就变成了:
-
如果
a=b\ \Lambda\ a=c\ \Lambda\ b=c\ \Lambda\ f_a = 0 ,这时对答案一的贡献为1 。 -
如果
a,b,c 中有两个相等,并且相等的i,j 满足f_{i,j} = 0\ \Lambda\ f_{j,i} = 0 ,那么对答案二的贡献为1 。
Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define rrep(i,x,y) for(int i=x;i>=y;i--)
#define sc scanf
#define pr printf
inline int read(){int s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-') w=-1;c=getchar();}while(isdigit(c)){s=(s<<1)+(s<<3)+(c^48);c=getchar();}return s*w;}
int ans1,ans2;
char a[4][4];
map <char,bool> f,f1[100];
inline char min(char a,char b){
return a<b?a:b;
}
inline char max(char a,char b){
return a>b?a:b;
}
inline void judge(char cow1,char cow2,char cow3){
if(cow1==cow2&&cow2==cow3){//三个都相等。
if(!f[cow1]){//没有重复,则对答案一贡献加 1。
ans1++;
f[cow1]=1;
}
}
else if(!(cow1!=cow2&&cow1!=cow3&&cow2!=cow3)){//如果不是两两不同,那么只有三个都相同或者有两个相同。因为 else 否决了一个,所以只剩下两个相同的情况。
char c1=min(cow1,min(cow2,cow3)),c2=max(cow1,max(cow2,cow3));//比最小值和最大值,方便查找不同的元素。
if(!f1[c1][c2]&&!f1[c2][c1]){//没有重复,则对答案二的贡献加 1。
ans2++;
f1[c1][c2]=f1[c2][c1]=1;
}
}
}
signed main(){
rep(i,1,3)
rep(j,1,3)
cin>>a[i][j];
rep(i,1,3){
judge(a[i][1],a[i][2],a[i][3]);//行。
//-------------------------------
judge(a[1][i],a[2][i],a[3][i]);//列。
}
judge(a[1][1],a[2][2],a[3][3]);
judge(a[1][3],a[2][2],a[3][1]);//对角线。
pr("%lld\n%lld\n",ans1,ans2);
return 0;
}