专栏文章

题解:P5461 赦免战俘

P5461题解参与者 5已保存评论 4

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
4 条
当前快照
1 份
快照标识符
@mip0rq82
此快照首次捕获于
2025/12/03 04:17
3 个月前
此快照最后确认于
2025/12/03 04:17
3 个月前
查看原文

思路:

在做这道题之前,建议大家去做一下 P5732杨辉三角,为什么这样说呢?因为这道题其实有一个递推解,和杨辉三角极为相似。我们把整个方阵看作一个二维数组 aa,并将 aa 数组归零,将方阵第一项设为 a[1][1]a[1][1],从而防止数组越位。这样可以发现 a[i][j]a[i][j] 的值便等于 a[i1][j+1]a[i-1][j+1] 的值加上 a[i1][j]a[i-1][j] 的值除以 22 的余数。接着,我们将 a[1][1]a[1][1] 的值为 00,再定义 n2n2 表示方阵的边长,于是就这样写下了代码。
CPP
#include<bits/stdc++.h>
using namespace std;
int shj(int n){
    return 1<<n;
}
int main(){
    bool a[5000][5000]={0};
    int n;
    cin>>n;
    int n2=shj(n);
    a[1][1]=0;
    for(int i=1;i<=n2;++i){
        for(int j=1;j<=n2;++j){
            a[i][j]=(a[i-1][j+1]+a[i-1][j])%2;
        }
    }
    for(int i=1;i<=n2;++i){
        for(int j=1;j<=n2;++j){
            cout<<a[i][j]<<' ';
        }
        cout<<'\n';
    }
    return 0;
}
然而却输出了一堆 00
我们继续来看,方阵第一行大多都是 00,然而第一行的最后一个是 11,如果把第一个设为 00 并没有什么用,但如果我们把 a[1][n2]a[1][n2] 设为 11 的话,这个问题不就解决了吗?
CPP
#include<bits/stdc++.h>
using namespace std;
int shj(int n){
    return 1<<n;
}
int main(){
    bool a[5000][5000]={0};
    int n;
    cin>>n;
    int n2=shj(n);
    a[1][n2]=1;
    for(int i=1;i<=n2;++i){
        for(int j=1;j<=n2;++j){
            a[i][j]=(a[i-1][j+1]+a[i-1][j])%2;
        }
    }
    for(int i=1;i<=n2;++i){
        for(int j=1;j<=n2;++j){
            cout<<a[i][j]<<' ';
        }
        cout<<'\n';
    }
    return 0;
}
然而却依然是一堆 00
我们再来看,我们虽然把 a[1][n2]a[1][n2] 定为 11,可当进行循环后又被覆盖了。因为方阵第一行最开始就被定义好了,所以解决这个问题的办法就是:从第二行开始运行! 即为跳过第一行,外层的循环从 22 开始。

代码:

CPP
#include<bits/stdc++.h>
using namespace std;
int shj(int n){
    return 1<<n;
}
int main(){
    bool a[5000][5000]={0};
    int n;
    cin>>n;
    int n2=shj(n);
    a[1][n2]=1;
    for(int i=2;i<=n2;++i){
        for(int j=1;j<=n2;++j){
            a[i][j]=(a[i-1][j+1]+a[i-1][j])%2;
        }
    }
    for(int i=1;i<=n2;++i){
        for(int j=1;j<=n2;++j){
            cout<<a[i][j]<<' ';
        }
        cout<<'\n';
    }
    return 0;
}

评论

4 条评论,欢迎与作者交流。

正在加载评论...