-
分析
考虑对矩阵染色。
对于 (s_{i,j}) 染色为 ((i+j) mod 3) 。
显然,不可能存在连续 3 个(不包括斜边)格子同颜色。
所以只要将同种颜色的格子改为 ( ext{O}) 就可以直接平局。
设不为空的格子数量为 (m) 。
若翻转颜色为 (0) 要翻转 (c_0) 次,颜色为 (1) 要翻转 (c_1) 次,颜色为 (2) 要翻转 (c_2) 次。、
因为 (c_0+c_1+c_2=m) 。
故 (min(c_0,c_1,c_2)=leftlfloordfrac{m}{3} ight floor)
所以对于本题,对于不为空的格子,选择出现次数最小的颜色所对应的非空格子全部改为 ( ext{O}) 即可解决本题。
最后,多测不清空,爆零两行泪 (没错说的就是我这个屑)。
- 代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int T,n;
char s[305][305],s2[305][305],s3[305][305];
int main()
{ scanf("%d",&T);
while(T--)
{ scanf("%d",&n);
for(int i=1;i<=n;i++)
{ scanf("%s",s[i]+1);
for(int j=1;j<=n;j++)
s2[i][j]=s3[i][j]=s[i][j];
}
int m=0,cnt=0,cnt2=0,cnt3=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{ if(s[i][j]!='X')continue;
m++;
if((i+j)%3==0)cnt++;
if((i+j)%3==1)cnt2++;
if((i+j)%3==2)cnt3++;
}
int x=min(cnt,min(cnt2,cnt3));
if(x==cnt)
{ for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
{ if(s[i][j]!='X')printf(".");
else if((i+j)%3==0)printf("O");
else printf("X");
}
printf("
");
}
}
else if(x==cnt2){
for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
{ if(s[i][j]!='X')printf(".");
else if((i+j)%3==1)printf("O");
else printf("X");
}
printf("
");
}
}
else if(x==cnt3){
for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
{ if(s[i][j]!='X')printf(".");
else if((i+j)%3==2)printf("O");
else printf("X");
}
printf("
");
}
}
}
return 0;
}
[ ext{by Rainy7}
]