洛谷 P5461 赦免战俘

洛谷 P5461 赦免战俘

自从选拔赛以来就没怎么认真刷题,总是感觉有点累,有点缺少动力。晚上做了到洛谷的基础题,调了1个多小时。。。

明明是一道很简单的递归题,还做了这么久,挺打击的,感觉自己真的是菜。递归可以说是所有算法的基础中的基础了,如果递归都理解的这么吃力,学习其他算法的困难可想而知,感觉自己还差得远,有点迷茫。

题目背景

借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了!

题目描述

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

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

输入格式

一个整数 nn

输出格式

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

输入输出样例

输入 #1

1
3

输出 #1

1
2
3
4
5
6
7
8
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

我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
using namespace std;

int n;
int prisoner[2049][2049];

int getn(int N)
{
int res = 1;
for(int i = 0; i < N; i++)
res *= 2;
return res;
}

void rescue(int sx, int sy, int ex, int ey)
{
if(sx == ex && sy == ey)
return;
int X = ex - sx, Y = ey - sy;
for(int i = sy; i < sy + Y / 2 + 1; i++)
for(int j = sx; j < sx + X / 2 + 1; j++)
prisoner[i][j] = 0;

rescue(sx + X / 2 + 1, sy, ex, sy + Y / 2);
rescue(sx, sy + Y / 2 + 1, sx + X / 2, ey);
rescue(sx + X / 2 + 1, sy + Y / 2 + 1, ex, ey);
}


int main(int argc, const char * argv[])
{
int N;
cin >> N;
n = getn(N);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
prisoner[i][j] = 1;
rescue(0, 0, n - 1, n - 1);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
cout << prisoner[i][j];
if(j < n - 1)
cout << " ";
else
cout << endl;
}


return 0;
}
作者

Jhuoer Yen

发布于

2021-03-19

更新于

2023-09-18

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×