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

被折叠的 条评论
为什么被折叠?



