题目链接:http://codeforces.com/problemset/problem/323/A
题目意思:给定值 k ,需要输出 k 个 k 行 k 列的单位立方体各表示什么颜色(或者是黑色或者是白色)。需要满足的条件是:如果是白色的单位立方体,那么它有且仅有2个白色的相邻单位立方体;如果是黑色的单位立方体,那么它有且仅有2个黑色的相邻单位立方体。要是给出的k不能构成满足这些条件的立方体,输出-1.
在纸上尝试过用次小的奇数 3 来模拟,发现无论如何都不能满足条件,于是大胆地猜测k是奇数的话是不行的。至于证明就...无能为力啊~希望会的读者能够指点迷津,不胜感激。
而偶数的话,为了简单起见,姑且用 k = 4 来说:
第 1 块和第 2 块:
至于第3块和第4块是和前面的两块是相同的。当然1,2块可以交换,但此时3,4块也要交换。至于其他的6,8,....2n都可以这样推。反正对于每一行,如果第1,2列输出的是 b ,那么下次的第5,6列页数输出 b。也就是说会相隔2个空格(这2个空格当然就是输出w了)。
本人觉得这样的解决方法比较简单,不必费太多的脑筋。读者如果有什么更好的办法,欢迎多多交流。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 6 int main() 7 { 8 int k, i, j, l; 9 while (scanf("%d", &k) != EOF) 10 { 11 if (k & 1) 12 puts("-1"); 13 else 14 { 15 for (l = 1; l <= k; l++) // 个 16 { 17 if (l & 1) 18 { 19 for (i = 1; i <= k; i++) // 行 20 { 21 for (j = 1; j <= k/2; j++) // 列 22 { 23 if (j & 1 && (i % 4 == 1 || i % 4 == 2)) 24 printf("bb"); 25 else if (!(j & 1) && (i % 4 == 1 || i % 4 == 2)) 26 printf("ww"); 27 else if (j & 1 && !(i % 4 == 1 || i % 4 == 2)) 28 printf("ww"); 29 else 30 printf("bb"); 31 } 32 printf("\n"); 33 } 34 } 35 else 36 { 37 for (i = 1; i <= k; i++) // 行 38 { 39 for (j = 1; j <= k/2; j++) // 列 40 { 41 if (j & 1 && (i % 4 == 1 || i % 4 == 2)) 42 printf("ww"); 43 else if (!(j & 1) && (i % 4 == 1 || i % 4 == 2)) 44 printf("bb"); 45 else if (j & 1 && !(i % 4 == 1 || i % 4 == 2)) 46 printf("bb"); 47 else 48 printf("ww"); 49 } 50 printf("\n"); 51 } 52 } 53 printf("\n"); 54 } 55 } 56 } 57 return 0; 58 } 59 60 61