You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一个二维数组嵌入另一个二维数组?(自制房间迷宫项目)

解决二维数组嵌入问题(迷宫中放置房间)

你的核心需求是把房间的二维数组嵌入到迷宫的二维数组中,当前代码的问题在于:

  • 共用了静态maze变量,生成房间时会直接覆盖之前的迷宫数组
  • 直接将数组转换成字符串输出,丢失了数组的原始结构,无法完成嵌入操作

下面是修改后的完整代码,实现数组嵌入功能:

import java.util.concurrent.ThreadLocalRandom;
import java.util.Arrays;

public class Main {
    // 生成房间二维数组
    public static String[][] createRoom(int maxSize) {
        int roomSize = ThreadLocalRandom.current().nextInt(5, maxSize + 1);
        String[][] room = new String[roomSize][roomSize];
        
        for (int i = 0; i < room.length; i++) {
            for (int j = 0; j < room[i].length; j++) {
                room[i][j] = "c";
                room[0][j] = "\u2014";
                room[room.length - 1][j] = "\u2014";
                room[i][0] = "\u007c";
                room[i][room.length - 1] = "\u007c";
                room[0][room.length - 1] = "+";
                room[room.length - 1][0] = "+";
                room[0][0] = "+";
                room[room.length - 1][room.length - 1] = "+";
            }
        }
        return room;
    }

    // 生成迷宫二维数组
    public static String[][] createMaze(int maxSize) {
        int mazeSize = ThreadLocalRandom.current().nextInt(40, maxSize + 1);
        String[][] maze = new String[mazeSize][mazeSize];
        
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[i].length; j++) {
                maze[i][j] = "r";
                maze[0][j] = "\u2014";
                maze[maze.length - 1][j] = "\u2014";
                maze[i][0] = "\u007c";
                maze[i][maze.length - 1] = "\u007c";
                maze[0][maze.length - 1] = "+";
                maze[maze.length - 1][0] = "+";
                maze[0][0] = "+";
                maze[maze.length - 1][maze.length - 1] = "+";
            }
        }
        return maze;
    }

    // 将房间数组嵌入迷宫指定位置
    public static void embedRoomIntoMaze(String[][] maze, String[][] room, int startX, int startY) {
        // 检查是否越界
        if (startX + room.length > maze.length || startY + room[0].length > maze[0].length) {
            System.out.println("房间尺寸超出迷宫范围,无法嵌入");
            return;
        }

        // 复制房间数组到迷宫对应位置
        for (int i = 0; i < room.length; i++) {
            System.arraycopy(room[i], 0, maze[startX + i], startY, room[i].length);
        }
    }

    // 将二维数组转为可打印字符串
    public static String arrayToString(String[][] arr) {
        StringBuilder sb = new StringBuilder();
        for (String[] row : arr) {
            sb.append(String.join(" ", row)).append("\n");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String[][] maze = createMaze(40);
        String[][] room = createRoom(10);
        
        // 计算居中嵌入的起始坐标
        int startX = (maze.length - room.length) / 2;
        int startY = (maze[0].length - room[0].length) / 2;
        
        embedRoomIntoMaze(maze, room, startX, startY);
        System.out.println(arrayToString(maze));
    }
}

关键改动说明:

  1. 拆分数组生成与格式化:让房间和迷宫方法返回二维数组,保留结构以便嵌入;单独用arrayToString处理打印格式。
  2. 新增嵌入逻辑:embedRoomIntoMaze方法负责把房间数组复制到迷宫指定位置,加入越界检查避免报错。
  3. 移除全局静态变量:不再共用maze变量,避免数组被覆盖。
  4. 自动计算嵌入位置:通过尺寸差计算居中坐标,也可以手动修改startX和startY调整房间位置。

内容的提问来源于stack exchange,提问作者Чертков Бронислав

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:32:31