一、题目洛谷P5461赦免战俘
二、解法
1、递归常规解法
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int a[1030][1030], n;//方形数组记录每名战俘是否被豁免
void shemian(int x, int y, int b) {//把顶点为x,y,边长为b的矩阵进行分割
if (b == 0) a[x][y] = 1;//如果这个格子不能再分,那这个格子的战俘无法赦免
else {
shemian(x + b / 2, y, b / 2);//右上矩阵
shemian(x, y + b / 2, b / 2);//左下矩阵
shemian(x + b / 2, y + b / 2, b / 2);//右下矩阵
}
}
void output(int b) {
for (int i = 0; i < b; i++) {
for (int j = 0; j < b; j++)
cout << a[i][j] <<" ";
cout << endl;
}
}
int main() {
scanf("%d", &n);
int bian = pow(2, n);//计算边长
shemian(0, 0, bian);//赦免战俘程序
output(bian);//输出
return 0;
}
2、递归解法+左移
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int a[1030][1030], n;//方形数组记录每名战俘是否被豁免
void shemian(int x, int y, int b) {
if (b == 0) a[x][y] = 1;//如果这个格子不能再分,那这个格子的战俘无法赦免
else {
shemian(x + (1 << b - 1), y, b - 1);//右上矩阵
shemian(x, y + (1 << b - 1), b - 1);//左下矩阵
shemian(x + (1 << b - 1), y + (1 << b - 1), b - 1);//右下矩阵
}
}
void output(int b) {
for (int i = 0; i < 1 << b; i++) {
for (int j = 0; j < 1 << b; j++)
cout << a[i][j] <<" ";
cout << endl;
}
}
int main() {
scanf("%d", &n);
shemian(0, 0, n);//赦免战俘程序
output(n);//输出
return 0;
}