题解:P10458 Fractal
思路:
根据输出样例我们可以知道 \(n\) 度的盒分形图为一个长宽为 \(3^{n-1}\) 的正方形。
设置递归函数 \({f(n,x,y)}\) 生成以坐标 \(x,y\) 为左上角的 \(n\) 度盒分形。
-
递归边界: 若 \(n=1\),则在 \(x,y\) 输出 \(X\)。
-
若 \(n > 1\),则计算 \(n - 1\) 度的盒子的规模 \(m = 3^{n-2}\),分别在左上方,右上方,中间,左下方和右下方 \(5\) 个 \(n-1\) 度的盒子。
-
对于左上方的 \(n-1\) 度的盒子,左上角的坐标为 \(x,y\)。递归函数为 \({f(n - 1,x + 2m , y)}\)。
-
对于右上方的 \(n-1\) 度的盒子, 右上方的坐标为 \(x + 2m,y\)。递归函数为 \({f( n - 1,x + 2m,y)}\)。
-
对于中间的 \(n-1\) 度的盒子,中间的坐标为 \(x + m,y + m\)。递归函数为 \({f(n-1,x+m,y+m)}\)。
-
对于左下方的 \(n-1\) 度的盒子,左下方的坐标为 \(x,y+2m\)。递归函数为 \({f (n-1,x,y+2m)}\) 。
-
对于右上方的 \(n-1\) 度的盒子,右下方的坐标为 \(x+2m,y+2m\)。递归函数为 \({f(n-1,x+2m,y+2m)}\)。
代码:
#include<bits/stdc++.h>
using namespace std;
char mp[730][730];
void f(int n, int x, int y) {
//递归边界
if (n == 1) {
mp[x][y]='X';
} else {
int m = pow(3, n - 2);
//递归5个位置
f(n - 1, x, y);
f(n-1, x+2*m, y);
f(n - 1, x , y + 2 * m);
f(n - 1, x + m, y + m);
f(n-1,x+2*m,y+2*m);
}
}
int main() {
int n ;
while (1) {
cin >> n;
if(n==-1) return 0;
int c=pow(3, n - 1);
//初始化
memset(mp,' ',sizeof(mp));
f(n, 0, 0);
for (int i = 0; i < c; i++) {
for(int j=0; j< c; j++) printf("%c",mp[i][j]);
cout<<endl;
}
cout <<'-'<<endl;
}
return 0;
}
笔者文风不好,请见谅。

浙公网安备 33010602011771号