输入样例:
COW
XXO
ABC
输出样例:
0
2
思路
利用set去重的性质,我们建立两个集合分别是
s
s
ss
s
s
和
d
s
ds
d
s
,分别存一头牛获胜和两头牛获胜的组合的值,其中
d
s
ds
d
s
集合中我是存
p
a
i
r
pair
p
a
i
r
类型。
主要也就是枚举三种连线情况:
1)横着连线
2)竖着连线
3)斜着连线,其中分为从左上到右下,以及左下到右上
代码
#include<bits/stdc++.h>
#include<algorithm>
#define pii pair<char,char>
#define inf 1e9
using namespace std;
const int N = 2010;
char p[4][4];
set<char>ss;
set<pii>ds;
set<char>s;
void solve(){
for(int i = 0;i < 3;i++)for(int j = 0;j < 3;j++)cin>>p[i][j];
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
s.insert(p[i][j]);
}
if(s.size()==2){
auto it = s.begin(), et = (++s.begin());
ds.insert({min(*it,*et),max(*it,*et)});
}
else if(s.size()==1){ss.insert(*s.begin());}
s.clear();
}
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
s.insert(p[j][i]);
}
if(s.size()==2){
auto it = s.begin(), et = (++s.begin());
ds.insert({min(*it,*et),max(*it,*et)});
}
else if(s.size()==1){ss.insert(*s.begin());}
s.clear();
}
for(int i = 0;i < 3;i++){s.insert(p[i][i]);}
if(s.size()==2){
auto it = s.begin(), et = (++s.begin());
ds.insert({min(*it,*et),max(*it,*et)});
}
else if(s.size()==1){ss.insert(*s.begin());}
s.clear();
for(int i = 2;i >=0;i--){s.insert(p[2-i][2-i]);}
if(s.size()==2){
auto it = s.begin(), et = (++s.begin());
ds.insert({min(*it,*et),max(*it,*et)});
}
else if(s.size()==1){ss.insert(*s.begin());}
s.clear();
cout<<ss.size()<<"\n"<<ds.size()<<"\n";
}
int main(){
solve();
return 0;
}