0
点赞
收藏
分享

微信扫一扫

递归-洛谷P5461赦免战俘

杨沐涵 2022-02-02 阅读 56
c++递归法

一、题目洛谷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;
}
举报

相关推荐

洛谷p1135

洛谷 P1307

洛谷p1551

洛谷P1309

P1217(洛谷)

洛谷p1443

洛谷P1090

洛谷P2084

0 条评论