栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Codeforces Global Round 12 1450.C2. Errich-Tac-Toe (Hard Version)(构造,三分图)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Codeforces Global Round 12 1450.C2. Errich-Tac-Toe (Hard Version)(构造,三分图)

link

Easy Version

考虑对这个图染色分类, ( i , j ) (i,j) (i,j)格子归为 ( i + j ) % 3 (i+j)%3 (i+j)%3类

然后在这三类格子中看看哪一类的标记最少,把那一类的 X rm X X都改成 O rm O O

这样做一定合法,因为任何连续的三个格子一定包含我们修改过的 O rm O O

#include 
using namespace std;
const int maxn = 3e5+10;
int t,n,kl[19];
char a[509][509];
int main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n;
		for(int i=1;i<=n;i++)	cin >> ( a[i]+1 );
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if( a[i][j]=='X' )	kl[(i+j)%3]++;
		int mi = 1e9, type = 0;
		for(int i=0;i<=2;i++)
			if( kl[i] 
Hard Version 

现在既有 X rm X X又有 O rm O O,无脑改变的话行不通了

但是可以仍然把格子花费为三类

考虑让 x x x类格子的 O rm O O变成 X rm X X,让 y y y类格子的 X rm X X变成 O rm O O( x ! = y x!=y x!=y)

这样任意相邻三个格子必定存在不同标记的格子,而且通过枚举 x , y x,y x,y必然存在满足条件的解

#include 
using namespace std;
const int maxn = 3e5+10;
int t,n,kl[19][2];
char a[509][509];
int main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n;
		for(int i=1;i<=n;i++)	cin >> ( a[i]+1 );
		memset( kl,0,sizeof kl );
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			if( a[i][j]=='X' )	kl[(i+j)%3][0]++;
			else if( a[i][j]=='O' )	kl[(i+j)%3][1]++;
		}
		int mi = 1e9, x = 0, y = 0;
		for(int i=0;i<=2;i++)
		for(int j=0;j<=2;j++)
		{
			if( i==j )	continue;
			if( kl[i][0]+kl[j][1]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号