AcWing 1725 组队井字游戏
思路很简单,我的实现代码太过复杂,下面放的有y总的简洁版代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<char, char>PCC;
int ans, res;
char g[3][3];
map<char, int>mp1; //记录单个
map<int, char>mp2; //记录组队
map<PCC, int>mp3;
int main()
{
for(int i = 0; i < 3; i ++ ){
for(int j = 0; j < 3; j ++ ){
cin>>g[i][j];
}
}
//单个成功的可能性有5条路
//横行
for(int i = 0; i < 3; i ++ ){
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int j = 0; j < 3; j ++ ){
mp1[g[i][j]] ++ ;
}
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 3){
mp2[j] = 1;
}
}
}
for(int i = 0; i < 3; i ++ ){
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int j = 0; j < 3; j ++ ){
mp1[g[j][i]] ++ ;
}
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 3){
mp2[j] = 1;
}
}
}
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int i = 0; i < 3; i ++ ){
for(int j = 0; j < 3; j ++ ){
if(i == j){
mp1[g[i][j]] ++ ;
}
}
}
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 3){
mp2[j] = 1;
}
}
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
mp1[g[0][2]] ++ ;
mp1[g[1][1]] ++ ;
mp1[g[2][0]] ++ ;
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 3){
mp2[j] = 1;
}
}
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int j = 'A'; j <= 'Z'; j ++ ){
ans += mp2[j];
}
for(int j = 'A'; j <= 'Z'; j ++ ){
mp2[j] = 0;
}
//考虑组队
for(int i = 0; i < 3; i ++ ){
char s[2];
bool flag1 = 0, flag2 = 0;
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int j = 0; j < 3; j ++ ){
mp1[g[i][j]] ++ ;
}
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 2){
mp2[j] = 1;
s[0] = j;
flag1 = 1;
}
else if(mp1[j] == 1){
s[1] = j;
flag2 = 1;
}
}
if(flag1 && flag2) mp3[{s[0], s[1]}] = 1;
}
for(int i = 0; i < 3; i ++ ){
char s[2];
bool flag1 = 0, flag2 = 0;
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int j = 0; j < 3; j ++ ){
mp1[g[j][i]] ++ ;
}
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 2){
mp2[j] = 1;
s[0] = j;
flag1 = 1;
}
else if(mp1[j] == 1){
s[1] = j;
flag2 = 1;
}
}
if(flag1 && flag2) mp3[{s[0], s[1]}] = 1;
}
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int i = 0; i < 3; i ++ ){
for(int j = 0; j < 3; j ++ ){
if(i == j){
mp1[g[i][j]] ++ ;
}
}
}
char s[2];
bool flag1 = 0, flag2 = 0;
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 2){
mp2[j] = 1;
s[0] = j;
flag1 = 1;
}
else if(mp1[j] == 1){
s[1] = j;
flag2 = 1;
}
}
if(flag1 && flag2) mp3[{s[0], s[1]}] = 1;
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
mp1[g[0][2]] ++ ;
mp1[g[1][1]] ++ ;
mp1[g[2][0]] ++ ;
char s1[2];
bool flag3 = 0, flag4 = 0;
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp1[j] == 2){
mp2[j] = 1;
s1[0] = j;
flag3 = 1;
}
else if(mp1[j] == 1){
s1[1] = j;
flag4 = 1;
}
}
if(flag3 && flag4) mp3[{s1[0], s1[1]}] = 1;
for(int j = 'A'; j <= 'Z'; j ++ ){
mp1[j] = 0;
}
for(int i = 'A'; i <= 'Z'; i ++ ){
for(int j = 'A'; j <= 'Z'; j ++ ){
if(mp3[{i, j}] == 1 && mp3[{j, i}] == 1){
res ++ ;
}
else if(mp3[{i, j}] == 1 && mp3[{j, i}] != 1){
res += 2;
}
}
}
res /= 2;
cout<<ans<<endl;
cout<<res<<endl;
return 0;
}
y总简洁版
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
set<set<char>> ans[2];
string g[3];
void insert(vector<vector<int>> ps)
{
set<char> S;
for (auto& p: ps)
{
int x = p[0], y = p[1];
S.insert(g[x][y]);
}
if (S.size() == 1) ans[0].insert(S);
else if (S.size() == 2) ans[1].insert(S);
}
int main()
{
for (int i = 0; i < 3; i ++ ) cin >> g[i];
for (int i = 0; i < 3; i ++ ) insert({{i, 0}, {i, 1}, {i, 2}});
for (int i = 0; i < 3; i ++ ) insert({{0, i}, {1, i}, {2, i}});
insert({{0, 0}, {1, 1}, {2, 2}});
insert({{2, 0}, {1, 1}, {0, 2}});
cout << ans[0].size() << endl;
cout << ans[1].size() << endl;
return 0;
}