每日一题——组队井字游戏

题目地址:https://www.acwing.com/problem/content/1727/

在这里插入图片描述
输入样例:

COW
XXO
ABC

输出样例:

0
2

思路

利用set去重的性质,我们建立两个集合分别是s s ssssd s dsds,分别存一头牛获胜和两头牛获胜的组合的值,其中d s dsds集合中我是存p a i r pairpair类型。

主要也就是枚举三种连线情况:
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;
}

版权声明:本文为qq_52800184原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。