官方题解

题意

给你两个 $3 \times 3$ 的大写字母方阵分别为正确答案和猜测结果。

请你求出猜测结果和正确答案字母和位置都一样的个数 和 猜测结果和正确答案字母一样但位置不一样的个数。

思路

  1. 分别统计两个方阵各个字母的个数。
  2. 对于 猜测结果和正确答案字母和位置都一样的个数,直接比对。
  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;
}
最后修改:2023 年 05 月 19 日
如果觉得我的文章对你有用,请随意赞赏