思路
这题就是要用递归来写。
就是分成四个区域,然后把第一块全部赋值为0,然后继续递归。
结束条件就是正方形的边为2。
源码
#include<bits/stdc++.h>
using namespace std;
int vis[1050][1050];
int n;
void dfs(int p,int x,int y){
if(p==2){ //结束条件,将左上角赋值为0
vis[x][y]=0;
return ;
}
for(int i=x;i<=x+p/2-1;i++){ //将四块中的左上角赋值为0
for(int j=y;j<=y+p/2-1;j++){
vis[i][j]=0;
}
}
dfs(p/2,p/2+x,y);
dfs(p/2,p/2+x,p/2+y);
dfs(p/2,x,p/2+y);
}
int main(){
cin>>n;
int p=pow(2,n);
for(int i=1;i<=p;i++){ //初始化
for(int j=1;j<=p;j++){
vis[i][j]=1;
}
}
dfs(p,1,1); //递归
for(int i=1;i<=p;i++){ //按条件输出
for(int j=1;j<=p-1;j++){
cout<<vis[i][j]<<" ";
}
cout<<vis[i][p]<<endl;
}
}
思路2
寻找不被赦免的战俘,将其赋值为1。
由题可以知道:三个方向要赋值为1.
则要写3层递归。
源码
#include<bits/stdc++.h>
using namespace std;
int a[1050][1050],n;
void cal(int x,int y,int n){
if(n==0) a[x][y]=1;
else {
cal(x+(1<<n-1),y,n-1);
cal(x,y+(1<<n-1),n-1);
cal(x+(1<<n-1),y+(1<<n-1),n-1);
}
}
int main(){
int n;
cin>>n;
cal(0,0,n);
for(int i=0;i<pow(2,n);i++){
for(int j=0;j<pow(2,n);j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}