The 2014 ACM-ICPC Asia Mudanjiang Regional First Round - B
题意:
用 n 块面积为 n 的图块拼满一个 n*n 的矩阵图,并且 n 块图只有四种颜色,相邻的图块不能有相同的颜色,任意的两块不能有相同的形状,包括旋转,对称;
注意当n为6 的时候会有相同的块,所以要特判一下;
代码:
#include
#include
const int MAXN = 117;
char mm[MAXN][MAXN];
char col[2];
int n;
void solve()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
mm[i][j] = 'B';
}
}
for(int i = 0; i < n; i++)
mm[0][i] = 'Y';
for(int i = 0; i < (n-1)/2; i++)
{
char c = col[i%2];
for(int j = i+1; j < n; j++)
{
mm[j][i] = c;
}
for(int j = 1; j <= i+1; j++)
{
mm[j][i+1] = c;
}
}
for(int i = (n-1)/2; i < n-1; i++)
{
char c = col[i%2];
for(int j = i+2; j < n; j++)
{
mm[j][i] = c;
}
mm[i+2][i+1] = c;
for(int j = 2; j <= i+2; j++)
{
mm[j][i+2] = c;
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
printf("%c",mm[i][j]);
}
printf("\n");
}
}
int main()
{
col[0] = 'G';
col[1] = 'R';
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(n == 1)
printf("Y\n");
else if(n <= 4)
printf("No solution!\n");
else if(n == 6)//特判
{
printf("YYYYYY\n");
printf("GGRGRR\n");
printf("GRRGRB\n");
printf("GRGGRB\n");
printf("GRGRRB\n");
printf("GRGBBB\n");
}
else
{
solve();
}
}
return 0;
}
个人理解:首先,我们必须要找出一个方法来保证图形的不一致性,笔者用的方法是
但是,我们来看 6*6 的情形
这道题基本上就是这样了