洛谷刷题C++语言 | P5461 赦免战俘

学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。

附上汇总贴:洛谷刷题C++语言 | 汇总_热爱编程的通信人的博客-CSDN博客


【题目描述】

现有 2^n×2^n(n≤10) 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。

给出 n,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。

【输入】

一个整数 n

【输出】

2^n×2^n 的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。

【输入样例】

3

【输出样例】

0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int a[1100][1100];
int fzdg(int x, int y, int z)
{
    if (z==1) return 0;
    for (int i=x; i<x+z/2; i++) {
        for (int j=y; j<y+z/2; j++) {
            a[i][j] = 1;
        }
    }
    fzdg(x+z/2, y, z/2);
    fzdg(x, y+z/2, z/2);
    fzdg(x+z/2, y+z/2, z/2);
}
int main()
{
    int n, fz;
    cin >> n;
    fz = pow(2, n);
    fzdg(1, 1, fz);
    for (int i=1; i<=fz; i++) {
        for (int j=1; j<=fz; j++) {
            if (a[i][j]==1) cout << "0 ";
            else cout << "1 ";
        }
        cout << endl;
    }
    return 0;
}

【运行结果】

3
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/132801643