1 条题解
-
0
思路
开两个
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
- 上传者