CF1450C2 Errich-Tac-Toe (Hard Version)

考虑刻画不合法条件。

给网格染色 \(col_{(x,y)}=(x+y)\mod 3\),则连续三个同色棋子的颜色 0,1,2 各一个。

easy version 中只有一种棋子,记录 \(c_{0/1/2}\) 表示每种颜色上有多少个棋子,\(\lfloor \frac{k}{3}\rfloor\) 步必定能将最小的 \(c\) 清零。

拓展到 hard version,记录 \(c,c'\),将 \((c_i+c'_j)_{\min},i\ne j\) 清零,将剩下的 \(c,c'\) 两两配对,容易发现必定能清零。

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define fin(x) freopen(#x".in","r",stdin)
#define fout(x) freopen(#x".out","w",stdout)
#define fr(x) fin(x),fout(x);
#define Fr(x,y) fin(x),fout(y)
#define INPUT(_1,_2,FILE,...) FILE
#define IO(...) INPUT(__VA_ARGS__,Fr,fr)(__VA_ARGS__)
using namespace std;
using namespace __gnu_pbds;
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define cfast ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define ll long long
#define ull unsigned long long
#define intz(x,y) memset((x),(y),sizeof((x)))
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#define tup(x) array<int,(x)>
inline ll read(){
    ll x=0,f=1;char ch=nc();
    while(ch<48||ch>57){if(ch=='-')f=-1;ch=nc();}
    while(ch>=48&&ch<=57)x=x*10+ch-48,ch=nc();
   	return x*f;
}
//void write(int x){cout<<x<<' ';}
//void write(pii x){cout<<"P("<<x.fi<<','<<x.se<<")\n";}
//void write(vector<auto>x){for(auto i:x)write(i);cout<<'\n';}
//void write(auto *a,int l,int r){for(int i=l;i<=r;i++)write(a[i]);cout<<'\n';}
inline ll lowbit(ll x){return x&-x;}
inline int pcount(ll x){
	for(int i=0,res=0;;res+=(x>>i)&1,i++)
		if(i>60)return res;
}

//struct mt{
//	ll v;
//	mt(){v=0;}
//	mt(int x){this->v=x;}
//	inline mt operator+(mt x){return {(v+x.v)%mod};}
//	inline mt operator-(mt x){return {(v+mod-x.v)%mod};}
//	inline mt operator*(mt x){return {1ll*v*x.v%mod};}
//};
//inline void add(mt &x,mt y){x=x+y;}
//mt qp(mt x,int y){mt res(1);for(;y;x=x*x,y>>=1)if(y&1)res=res*x;return res;}
const int N=305;
vector<pii>c[3][3];char p[N][N];
inline void UesugiErii(){
	int n,mn=1e9;pii id;cin>>n;
	for(int i:{0,1,2})
		c[i][0].clear(),c[i][1].clear(),c[i][2].clear();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>p[i][j],c[(i+j)%3][p[i][j]=='X'?0:(p[i][j]=='O'?1:2)].pb(mp(i,j));
	for(int i:{0,1,2})
		for(int j:{0,1,2})if(i^j){
			if(mn>c[i][0].size()+c[j][1].size())
			   mn=c[i][0].size()+c[j][1].size(),id=mp(i,j);
		}
	for(pii i:c[id.fi][0])p[i.fi][i.se]='O';
	for(pii i:c[id.se][1])p[i.fi][i.se]='X';
//	cerr<<id.fi<<' '<<id.se<<'\n';
	for(int i=1;i<=n;i++,cout<<'\n')
		for(int j=1;j<=n;j++)cout<<p[i][j];
}
signed main(){
	//IO();
	cfast;
	int _=1;cin>>_;
	for(;_;_--)UesugiErii();
	return 0;
}
posted @ 2025-11-25 14:24  Uesugi1  阅读(5)  评论(0)    收藏  举报