赦免战俘

该博客讨论了一个使用递归解决的矩阵操作问题。代码实现中,通过四种不同的操作类型(左上角、右上角、左下角、右下角)对矩阵进行更新,并递归地将操作应用到子矩阵。程序最终输出处理后的矩阵,其中包含大量0和1。递归过程中,特别处理了行数和列数相等的情况,以避免不必要的遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P5741赦免战俘

根据题意有四种操作而且是重复操作便可以想到递归

递归语句

void dfs(int a,int b,int a1,int b1,int book)//a行数开始,b行数结束,a1列数开始,b1列数结束,book操作类型 
不同的四种操作
	
	dfs(a,(a+b)/2,a1,(a1+b1)/2,1);//操作左上角
	
	dfs(a,(a+b)/2,(a1+b1)/2+1,b1,2);//操作右上角 

	dfs((a+b)/2+1,b,a1,(a1+b1)/2,3);//操作左下角 
	dfs((a+b)/2+1,b,(a1+b1)/2+1,b1,4);//操作右下角

递归

1. 操作左上角时
if(book==1)
	{
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=1;
		return ;
	} 
2. 操作右上角时
if(book==2){
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=0;
		if(a==b && a1==b1)
			return ;
	}
3. 操作左下角时
if(book==3){
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=0;
		if(a==b && a1==b1)
			return ;
	}
4.操作右下角
if(book==4){
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=0;
		if(a==b && a1==b1)
			return ;
	}

其实可以发现后三个都有共同点

  • 当行数起始等于行数终止时且列数起始等于列数终止时 这部分就遍历完了

还有个2的n次方需要处理

完整的AC code

int s(int a)
{
	int shu=1;
	for(int i=1;i<=a;++i) shu*=2;
	return shu; 
}

#include<cstdio>
#include<iostream>

using namespace std;

int n;
int m[2050][2050];
void dfs(int a,int b,int a1,int b1,int book)//a行数开始,b行数结束,a1列数开始,b1列数结束,book操作类型 
{	
	if(book==1)
	{
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=1;
		return ;
	} 
	else if(book==2){
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=0;
		if(a==b && a1==b1)
			return ;
	}
	else if(book==3){
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=0;
		if(a==b && a1==b1)
			return ;
	}
	else if(book==4){
		for(int i=a;i<=b;++i)
			for(int j=a1;j<=b1;++j)
				m[i][j]=0;
		if(a==b && a1==b1)
			return ;
	}
		
		
	dfs(a,(a+b)/2,a1,(a1+b1)/2,1);//操作左上角
	
	dfs(a,(a+b)/2,(a1+b1)/2+1,b1,2);//操作右上角 

	dfs((a+b)/2+1,b,a1,(a1+b1)/2,3);//操作左下角 
	dfs((a+b)/2+1,b,(a1+b1)/2+1,b1,4);//操作右下角 
}
int s(int a)
{
	int shu=1;
	for(int i=1;i<=a;++i) shu*=2;
	return shu; 
}
int main()
{
//	freopen("1.out","w",stdout);
	cin>>n;
	int limit=s(n);
	dfs(1,limit,1,limit,0);

	for(int i=1;i<=limit;++i){
		for(int j=1;j<=limit;++j)
		if(m[i][j]==0) cout<<"1 ";
		else cout<<"0 ";
	
		cout<<endl;
	}
	return 0;
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值