题意
给你两个 $3 \times 3$ 的大写字母方阵分别为正确答案和猜测结果。
请你求出猜测结果和正确答案字母和位置都一样的个数 和 猜测结果和正确答案字母一样但位置不一样的个数。
思路
- 分别统计两个方阵各个字母的个数。
- 对于 猜测结果和正确答案字母和位置都一样的个数,直接比对。
- 对于 猜测结果和正确答案字母一样但位置不一样的个数,为 猜测中该字母的个数 $-$ 猜测结果和正确答案字母和位置都一样的个数 与 $\max($正确答案中该字母的个数 $-$ 猜测结果和正确答案字母和位置都一样的个数$,0)$ 的较小值。
实现
#include<bits/stdc++.h>
using namespace std;
char ac[10][10],wa[10][10];int gsac[30],gswa[30],g[30],y[30];
void input(){
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
cin>>ac[i][j];
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
cin>>wa[i][j];
}
void tj(){
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++){
gsac[ac[i][j]-'A'+1]++;
gswa[wa[i][j]-'A'+1]++;
}
}
void green(){
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
if(ac[i][j]==wa[i][j]){
g[ac[i][j]-'A'+1]++;
g[0]++;
}
}
void yellow(){
for(int i=1;i<=26;i++)
y[0]+=min(gswa[i]-g[i],max(gsac[i]-g[i],0));
}
void print(){
cout<<g[0]<<"\n"<<y[0];
}
int main(){
input();//输入
tj();//分别统计两个方阵各个字母的个数
green();//处理 猜测结果和正确答案字母和位置都一样的个数
yellow();//处理 猜测结果和正确答案字母一样但位置不一样的个数
print();//输出
return 0;
}