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;
}