题目
若B(1)=′X′B(1)='X'B(1)=′X′
B(n)(n>1)=B(n)(n>1)=B(n)(n>1)=
B(n−1)(3n−1个空格)B(n−1)B(n-1)(3^{n-1}个空格)B(n-1)B(n−1)(3n−1个空格)B(n−1)
(3n−1个空格)B(n−1)(3n−1个空格)(3^{n-1}个空格)B(n-1)(3^{n-1}个空格)(3n−1个空格)B(n−1)(3n−1个空格)
B(n−1)(3n−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("-");
}
}
本文介绍了一种基于递归构造的算法,该算法用于解决特定形式的字符串构造问题。通过对B(n)的定义和递归过程进行分析,利用分治策略实现了一个能够生成特定格式字符串的程序,并详细展示了其代码实现。
810

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



