1 条题解

  • 0
    @ 2026-10-20 23:56:05

    【深基7.例8】赦免战俘

    解题思路

    把行列从 0 编号。每次四分对应检查行、列编号的同一二进制位;两者该位均为 0,说明进入了左上区域,应被赦免。只有每一位至少有一个 1 的位置不被赦免,即 (i | j) == 2^n-1。

    正确性说明

    每层的左上象限恰好对应当前行位和列位同时为 0。一旦有这种层级,该位置被赦免;所有层级都不存在这种情况时才保留 1。按位或恰好判定这一条件。

    易错点

    编号从 0 开始;按位或是 |,不要写成逻辑或 ||。

    复杂度

    边长 N=2^n,时间 O(N²),额外空间 O(1)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        cin >> n;
        int N = 1 << n;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (j)
                    cout << " ";
                cout << ((i | j) == N - 1 ? 1 : 0);
            }
            cout << "\n";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    9
    时间
    1000ms
    内存
    125MiB
    难度
    普及−
    标签
    递交数
    1
    已通过
    1
    上传者