G - Stair-like Grid atcoder 超级详细

对于一个非负整数 𝐾K ,我们定义一个水平- 𝐾K 地毯如下:

  • 00 级地毯是由单个黑色单元格组成的 1×11×1 网格。
  • 对于 𝐾>0K>0 , 𝐾K 级地毯是一个 3𝐾×3𝐾3K×3K 网格。当这个网格被分成九个 3𝐾−1×3𝐾−13K−1×3K−1 块时:
    • 中央区块完全由白色单元格组成。
    • 其他八个区块是 (𝐾−1)(K−1) 级地毯。

给你一个非负整数 𝑁N 。
请按照指定格式打印 𝑁N 级地毯。

 public class Main {
    public static void main(String[] args) {
        int n = 2;
        String[][] res = getRes(n);
        for (String[] re : res) {
            for (String s : re) {
                System.out.print(s);
            }
            System.out.println();
        }


    }

    public static String[][] getRes(int n) {
        if (n == 0) {
            return new String[][]{{"#"}};
        }
        int size = (int) Math.pow(3, n);
        String[][] res = new String[size][size];
        int length = size / 3;
        /*中间的部分是.
         * length 是指现在这二维数组一共有几块内容
         * 【】【】【】
         * 【】【】【】
         * 【】【】【】
         * 以上面这个为例子,数组就是从length开始,长度也是length
         * 数组是从0开始的,也就是说中间的长度是从0+length开始,以一个正常人的思路来说开始统一是从1开始,
         * 假设长度是2,那么也就是从3开始,1 2 为第一个部分,3开始为第二个部分
         * 数组从零开始,也就是说从0+length
         * 其他的地方复制那个地方的二维数组
         * */
        for (int i = length; i < 2 * length; i++) {
            for (int j = length; j < 2 * length; j++) {
                res[i][j] = ".";
            }
        }
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (i == 1 && j == 1) {
                    continue;//中间的部分已经好了
                }
                String[][] temp = getRes(n - 1);
                //得到这块小地方的图形,然后把这一小块图形复制给总图形就可以了
                //敲黑板了,总图形怎么确定他具体的位置呢
                /*
                 * 我们来想一下呀
                 * 我们递归的逻辑就是无论他每一块多大,我们都把他们一行分成三份,每一份中间所有元素的总和就是length
                 * 所以我们只要确定了他在整个九宫格里的起点和终点就可以了
                 * 按照我们上方分析的逻辑,开始的位置一定是i*length 这个没问题吧,终点是什么,终点就是i*length +length
                 * 上下左右都是这样,那么代码就很容易写下来了
                 * */
                for (int c = 0; c < length; c++) {
                    for (int x = 0; x < length; x++) {
                        //我们这边是递归实现的
                        res[i * length + c][j * length + x] = temp[c][x];
                    }
                }


            }
        }
        return res;


    }
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值