题目
若
B
(
1
)
=
′
X
′
B(1)='X'
B(1)=′X′
B
(
n
)
(
n
>
1
)
=
B(n)(n>1)=
B(n)(n>1)=
B
(
n
−
1
)
(
3
n
−
1
个
空
格
)
B
(
n
−
1
)
B(n-1)(3^{n-1}个空格)B(n-1)
B(n−1)(3n−1个空格)B(n−1)
(
3
n
−
1
个
空
格
)
B
(
n
−
1
)
(
3
n
−
1
个
空
格
)
(3^{n-1}个空格)B(n-1)(3^{n-1}个空格)
(3n−1个空格)B(n−1)(3n−1个空格)
B
(
n
−
1
)
(
3
n
−
1
个
空
格
)
B
(
n
−
1
)
B(n-1)(3^{n-1}个空格)B(n-1)
B(n−1)(3n−1个空格)B(n−1)
给出若干个n,问B(n)
分析
可以用分治的方法对于B(n-1)有5种可能,所以通过5种可能分治,then
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int f[7]={1,3,9,27,81,243,729};
int x; bool answer[731][731];
void gz(int n,int x,int y){
if (!n) answer[x][y]=1;
else{
gz(n-1,x,y);//原位置
gz(n-1,x+f[n-1]*2,y);//下移(3^(n-1))*2的位置
gz(n-1,x,y+f[n-1]*2);//右移(3^(n-1))*2的位置
gz(n-1,x+f[n-1],y+f[n-1]);//右移3^(n-1)并下移3^(n-1)的位置
gz(n-1,x+f[n-1]*2,y+f[n-1]*2);//右移(3^(n-1))*2并下移(3^(n-1))*2的位置
}
}
int main(){
gz(6,1,1);
while (1){
scanf("%d",&x);
if (x==-1) return 0;
for (int i=1;i<=f[x-1];i++,putchar('\n'))
for (int j=1;j<=f[x-1];j++) putchar(answer[i][j]?'X':' ');//输出答案
puts("-");
}
}