1 条题解

  • 0
    @ 2026-5-19 1:09:01

    题目


    思路

    开两个 set 分别记录两个答案具体的奶牛(顺便去重),最终输出大小即可。

    然后枚举每条直线,记录所含的奶牛的数量,枚举,如果满足条件加进 set 中。注意一下两头奶牛组成的队伍的情况的细节,需要分别记录。

    代码看似很长,其实只是复制而已。


    代码

    #include "bits/stdc++.h"
    #define mkp(a , b) make_pair(a , b)
    using namespace std;
    char c[4][4] , f = '@' , s = '@';
    set<char> ans1;
    set<pair<char , char>> ans2;
    int main()
    {
        for (int i = 1 ; i <= 3 ; i++)
            for (int j = 1 ; j <= 3 ; j++) cin >> c[i][j];
    
        //行
        for (int i = 1 ; i <= 3 ; i++)
        {
            map<char , int> mp1;
            for (int j = 1 ; j <= 3 ; j++) ++mp1[c[i][j]];
            for (auto i : mp1)
                if (i.second == 3) ans1.insert(i.first);
                else if (i.second == 2) f = i.first;
                else if (i.second == 1) s = i.first;
            if (f != '@' && s != '@') ans2.insert(mkp(max(f , s) , min(f , s)));
            f = s = '@';
        }
        //列
        for (int i = 1 ; i <= 3 ; i++)
        {
            map<char , int> mp1;
            for (int j = 1 ; j <= 3 ; j++) ++mp1[c[j][i]];
            for (auto i : mp1)
                if (i.second == 3) ans1.insert(i.first);
                else if (i.second == 2) f = i.first;
                else if (i.second == 1) s = i.first;
            if (f != '@' && s != '@') ans2.insert(mkp(max(f , s) , min(f , s)));
            f = s = '@';
        }
        //右对角
        map<char , int> mp1;
        for (int i = 1 ; i <= 3 ; i++) ++mp1[c[i][i]];
        for (auto i : mp1)
            if (i.second == 3) ans1.insert(i.first);
            else if (i.second == 2) f = i.first;
            else if (i.second == 1) s = i.first;
        if (f != '@' && s != '@') ans2.insert(mkp(max(f , s) , min(f , s)));
        f = s = '@';
        //左对角
        map<char , int> mp2;
        for (int i = 1 ; i <= 3 ; i++) ++mp2[c[i][4 - i]];
        for (auto i : mp2)
            if (i.second == 3) ans1.insert(i.first);
            else if (i.second == 2) f = i.first;
            else if (i.second == 1) s = i.first;
        if (f != '@' && s != '@') ans2.insert(mkp(max(f , s) , min(f , s)));
        f = s = '@';
        cout << ans1.size() << '\n' << ans2.size() << '\n';
        return 0;
    }
    
    • 1

    信息

    ID
    6787
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    25
    已通过
    4
    上传者