C1. Errich-Tac-Toe (Easy Version)
题意
XO游戏,X和O都不能有三个连在一起的,但是斜着可以连在一起。
思路
这个题昨天晚上真的是好多人翻车了,还好最后被一个群友提供了一些思路,让我才成功的上青,知道要斜着一层一层标记,但是并不能证明为啥这样改变XO会小于K/3下取整,今天看了题解才明白,这个题挺不错的。
代码
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
const int N = 310;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
char a[N][N];
int vis[N+N];
bool vis1[N+N],vis2[N+N],vis3[N+N];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(a,0,sizeof a);
memset(vis,0,sizeof vis);
memset(vis1,0,sizeof vis1);
memset(vis2,0,sizeof vis2);
memset(vis3,0,sizeof vis3);
int n;
cin>>n;
int x=0;
while(2+x<=n+n)
{
vis1[2+x]=true;
x+=3;
}
x=0;
while(3+x<=n+n)
{
vis2[3+x]=true;
x+=3;
}
x=0;
while(4+x<=n+n)
{
vis3[4+x]=true;
x+=3;
}
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
cin>>a[i][j];
if(a[i][j]=='X') vis[i+j]++;
}
}
int x1=0,x2=0,x3=0;
for(int i=2 ; i<=n+n ; i++)
{
// cout<<i<<" "<<vis[i]<<endl;
if((i+1)%3==0)
{
x1+=vis[i];
// cout<<"*0"<<vis[i]<<endl;
}
if((i+1)%3==1)
{
x2+=vis[i];
// cout<<"*1"<<vis[i]<<endl;
}
if((i+1)%3==2)
{
x3+=vis[i];
//cout<<"*2"<<vis[i]<<endl;
}
}
//cout<<x1<<" "<<x2<<" "<<x3<<endl;
int min1=min(x1,min(x2,x3));
// cout<<"min1="<<min1<<endl;
if(min1==x1)
{
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
if(vis1[i+j])
{
if(a[i][j]=='X') a[i][j]='O';
}
}
}
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
cout<<a[i][j];
}
cout<<endl;
}
continue;
}
if(min1==x2)
{
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
if(vis2[i+j])
{
if(a[i][j]=='X') a[i][j]='O';
}
}
}
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
cout<<a[i][j];
}
cout<<endl;
}
continue;
}
if(min1==x3)
{
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
if(vis3[i+j])
{
if(a[i][j]=='X') a[i][j]='O';
}
}
}
for(int i=1 ; i<=n ; i++)
{
for(int j=1 ; j<=n ; j++)
{
cout<<a[i][j];
}
cout<<endl;
}
continue;
}
}
return 0;
}
总结
这种构造题还是写的太少,遇到了不知所措,不知道怎么写。