题目是这样的
# 赦免战俘
## 题目背景
借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了!
## 题目描述
现有 $2^n\times 2^n (n\le10)$ 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。
给出 $n$,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。
## 输入格式
一个整数 $n$。
## 输出格式
$2^n \times 2^n$ 的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。
## 样例 #1
### 样例输入 #1
```
3
```
### 样例输出 #1
```
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
```
今天做到的题,第一次用对我来说比较复杂的递归
看到答案区的大佬们的答案,真的好强,我觉得我这个答案是比较适合菜鸡看的吧哈哈哈哈哈
中间debug写了一大堆输出总算是找到自己错在哪里了……哈哈哈
咳咳,回归正题
主要就是找到对应点位,用点位的变换抽象为分割矩阵进行操作
#include <bits/stdc++.h>
using namespace std;
void Amnesty(vector<vector<int>>& mat, // 直接对原始矩阵进行操作
int row, int col, // 操作的行列长度
int start_row, int start_col, // 操作的行列起始
int ori_row, int ori_col) // 操作的递归标识性row、col值
{ // 无法直接传入一整个矩阵多线操作,直接传入对应的全新row和col值
// 操作步骤,将左上角的矩阵全转为0
for(int i = start_row; i < row; i ++) {
for(int j = start_col; j < col; j++) {
mat[i][j] = 0;
}
}
// // 测试输出,debug
// cout << "MATRIX: " << endl;
// for(int i = 0; i < 8; i++) {
// for(int j = 0; j < 8; j++) {
// cout << mat[i][j] << " ";
// } cout << endl;
// }
// cout << "MATRIX_Jr: " << endl;
// for(int i = start_row; i < row; i ++) {
// for(int j = start_col; j < col; j++) {
// cout << mat[i][j] << " ";
// } cout << endl;
// }
// cout << "row: " << row << " " << "col: "<< col << endl;
// cout << "start_row: " << start_row << " " << "start_col: " << start_col << endl;
// cout << "ori_row: " << ori_row << " " << "ori_col: " << ori_col << endl;
// cout << endl;
if(ori_row >= 2 && ori_col >= 2) {
// 右上角的矩阵递归
Amnesty(mat,
start_row + ori_row / 4, start_col + ori_col / 2 + ori_col / 4,
start_row, start_col + ori_col / 2,
ori_row / 2, ori_col / 2);
// 左下角的矩阵递归
Amnesty(mat,
start_row + ori_row / 2 + ori_row / 4, start_col + ori_col / 4,
start_row + ori_row / 2, start_col,
ori_row / 2, ori_col / 2);
// 右下角的矩阵递归
Amnesty(mat,
start_row + ori_row / 2 + ori_row / 4, start_col + ori_col / 2 + ori_col / 4,
start_row + ori_row / 2, start_col + ori_col / 2,
ori_row / 2, ori_col / 2);
} else return;
}
int main() {
int n;
cin >> n;
int row = pow(2, n), col = row, start_row = 0, start_col = 0, ori_row = row, ori_col = col;
vector<vector<int>> prsnr(row, vector<int>(col, 1)); // 创造二位矩阵全赋值为1,代表全部不豁免
Amnesty(prsnr, row / 2, col / 2, start_row, start_col, ori_row, ori_col);
for(int i = 0; i < row; i++) {
for(int j = 0; j < col; j++) {
cout << prsnr[i][j] << " ";
} cout << endl;
}
return 0;
}