1 条题解

  • 0
    @ 2025-8-24 22:58:09

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar sillation
    有朋自远方来,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,然后鞭数十,再驱之别院。子曰:“不亦乐乎?”

    搬运于2025-08-24 22:58:09,当前版本为作者最后更新于2024-05-18 20:56:55,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门


    思路:

    根据输出样例我们可以知道 nn 度的盒分形图为一个长宽为 3n13^{n-1} 的正方形。

    设置递归函数 f(n,x,y){f(n,x,y)} 生成以坐标 x,yx,y 为左上角的 nn 度盒分形。

    1. 递归边界: 若 n=1n=1,则在 x,yx,y 输出 XX

    2. n>1n > 1,则计算 n1n - 1 度的盒子的规模 m=3n2m = 3^{n-2},分别在左上方,右上方,中间,左下方和右下方 55n1n-1 度的盒子。

    • 对于左上方的 n1n-1 度的盒子,左上角的坐标为 x,yx,y。递归函数为 f(n1,x+2m,y){f(n - 1,x + 2m , y)}

    • 对于右上方的 n1n-1 度的盒子, 右上方的坐标为 x+2m,yx + 2m,y。递归函数为 f(n1,x+2m,y){f( n - 1,x + 2m,y)}

    • 对于中间的 n1n-1 度的盒子,中间的坐标为 x+m,y+mx + m,y + m。递归函数为 f(n1,x+m,y+m){f(n-1,x+m,y+m)}

    • 对于左下方的 n1n-1 度的盒子,左下方的坐标为 x,y+2mx,y+2m。递归函数为 f(n1,x,y+2m){f (n-1,x,y+2m)}

    • 对于右上方的 n1n-1 度的盒子,右下方的坐标为 x+2m,y+2mx+2m,y+2m。递归函数为 f(n1,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;
    }
    

    笔者文风不好,请见谅。

    • 1

    信息

    ID
    10082
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者