题目大意:给出一个n*n的矩形块,要将其切成n块面积为n的连续块,要求这些连续块不能相同(旋转,翻转后不能相同),然后再将这些块涂色
解题思路:
1.n为1的情况,只有一块,直接输出
2.n不为1且n小于等于4的情况是无法切割成所要求的结果
3.n为6时是一个特殊的块,因为按照构造规律来构造的话,就会出现重复,所以要特殊处理
4.这个构造规律可以通过画图得到,具体用代码实现一下就可以发现规律了,这里就不详说了
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 110
int n, g[maxn][maxn];
char color[10] = "YGRB";
char six[10][10] = {"BBBBBB","GGRGRR","GRRGRB","GRGGRB","GRGRRB","GRGBBB"};
void solve() {
memset(g,0,sizeof(g));
for(int i = 0; i < n; i++)
g[0][i] = 3;
int mid = (n - 1) / 2, col = 2;
for(int i = 0; i < mid; i++) {
for(int j = 1; j <= i + 1; j++)
g[j][i+1] = col;
for(int j = i + 1; j < n; j++)
g[j][i] = col;
col = 3 - col;
}
for(int i = mid; i < n; i++) {
for(int j = 2; j <= i+2; j++)
g[j][i+2] = col;
g[i+2][i+1] = col;
for(int j = i + 2; j < n; j++)
g[j][i] = col;
col = 3 - col;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++)
printf("%c",color[g[i][j]]);
printf("\n");
}
}
int main() {
int test;
scanf("%d", &test);
while(test--) {
scanf("%d", &n);
if(n == 1)
printf("B\n");
else if(n == 6)
for(int i = 0; i < n; i++)
printf("%s\n",six[i]);
else if(n >= 5)
solve();
else
printf("No solution!\n");
}
return 0;
}