题目链接:https://ac.nowcoder.com/acm/problem/213757
到主站看:https://blog.csdn.net/weixin_43346722/article/details/110008544
题目
scimoon 有一个包含了 个小方块的立方体(比如,三阶魔方就是一个包含了
个小方块的立方体)
我们称:两个方块是相邻的当且仅当他们有一个公共的面
现在 scimoon 想要给每个小方块上黑白两色之一,使得:
与一个黑色方块相邻的方块恰好有两个是黑色的
与一个白色方块相邻的方块恰好有两个是白色的
由于这个问题非常困难,所以 scimoon 想让聪明的你解决这个问题
输入
一个整数 ,意义与题目描述中一致
输出
如果没有解,请输出 ,否则,请你输出这个立方体
输出方式为:自底向上输出 个
的矩阵,第
个矩阵中的数
代表第
层,第
行,第
列的方块的颜色
一个方块是黑色的请输出 ,否则输出
样例输入1
2
样例输出1
1 1 0 0 1 1 0 0
样例输入2
1
样例输出2
-1
数据范围
思路
这道题是一道思维题。
我们可以想到有两种情况。
第一:
形如这样:
1111 0000 1111 0000 1111 1001 0110 1001 0110 1001 1001 0110 1001 0110 1001 1111 0000 1111 0000 1111
因为题目要一个方块周围只有两个方块跟它颜色相同,那所有都要满足这样,那其实可以说就是一个连在一起的相同颜色的就会是一个链子(或者一个环)
就是把每个方块都连一条边向它旁边颜色相同的边,那要只会每个方块都之连向两条边,就是要形成许多的环。
那就可以想到对于每一个平面,先在最外面围一层同一个颜色(假设为白色),然后里面一层就围黑色,然后再里面一层又围白色,以此类推。
然后在下一个平面就是上一个平面全部反过来。(这样不同平面之间就不会连边)、
那可以看出如果边长是偶数,就围不成。因为最后会剩下一个点单独存在,就像这样:
111 101 111
第二:
我们可以根据上面想到,要形成最小的链子,就是这样的结构:
11 11
或者这个:
00 00
(就是 的方块)
那我们就错开摆放,也是合法的。
就像这样:
1100 0011 1100 0011 1100 0011 1100 0011 0011 1100 0011 1100 0011 1100 0011 1100
那我们也同样可以得出当边长是奇数的时候围不成。
代码
#include<cstdio> using namespace std; int n, a[101][101]; int main() { scanf("%d", &n); if (n & 1) { printf("-1"); return 0; } for (int i = 1; i <= n / 2; i += 2) {//先排出第一层 for (int j = i; j <= n - i + 1; j++) { a[i][j] = 1; a[j][i] = 1; a[n - i + 1][j] = 1; a[j][n - i + 1] = 1; } } for (int i = 1; i <= n; i++)//输出 for (int j = 1; j <= n; j++) { for (int k = 1; k <= n; k++) printf("%d ", a[j][k] ^ (i % 2)); printf("\n"); } return 0; }