Codeforces Global Round 12 1450.C2. Errich-Tac-Toe (Hard Version)(构造,三分图)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 12 1450.C2. Errich-Tac-Toe (Hard Version)(构造,三分图)相关的知识,希望对你有一定的参考价值。
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 <bits/stdc++.h>
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]<mi ) type = i, mi = kl[i];
cout << type << endl;
kl[0] = kl[1] = kl[2] = 0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if( a[i][j]=='.' ) cout << a[i][j];
else printf("%c",( (i+j)%3==type)?'O':'X' );
if( j==n ) cout << endl;
}
}
}
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 <bits/stdc++.h>
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]<mi )
mi = kl[i][0]+kl[j][1], x = i, y = j;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if( (i+j)%3==x && a[i][j]=='X' ) cout << 'O';
else if( (i+j)%3==y && a[i][j]=='O' ) cout << 'X';
else cout << a[i][j];
if( j==n ) cout << endl;
}
}
}
以上是关于Codeforces Global Round 12 1450.C2. Errich-Tac-Toe (Hard Version)(构造,三分图)的主要内容,如果未能解决你的问题,请参考以下文章