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

如何向二维int数组随机添加20个障碍且不改动起点终点及原有障碍

随机障碍添加方法实现

需求梳理

基于10*10二维数组存储的寻路地图,实现随机新增障碍的逻辑,规则如下:

  • 数组元素值为1代表障碍,值为0代表可通行区域
  • 固定起点坐标[0, 0]、终点坐标[9, 9],两个位置的取值永远不能修改
  • 初始数组内已有的原有障碍不能改动
  • 总共需要新增20个随机位置的障碍,最终返回修改后的数组

初始地图定义如下:

int[][] map = {
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
                {0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        };

实现代码

采用先收集所有合法空位、再随机抽取位置放障碍的逻辑,避免反复随机撞无效位置的低效问题,可直接运行:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class MapObstacleGenerator {
    // 固定配置
    private static final int START_ROW = 0;
    private static final int START_COL = 0;
    private static final int END_ROW = 9;
    private static final int END_COL = 9;
    private static final int NEW_OBSTACLE_COUNT = 20;

    public static int[][] addRandomObstacles(int[][] map) {
        // 基础入参校验
        if (map == null || map.length != 10 || map[0].length != 10) {
            throw new IllegalArgumentException("输入地图必须为10*10规格的二维数组");
        }

        // 收集所有可以放新障碍的位置:值为0,且不是起点/终点
        List<int[]> validPositions = new ArrayList<>();
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                // 跳过起点和终点
                if ((i == START_ROW && j == START_COL) || (i == END_ROW && j == END_COL)) {
                    continue;
                }
                // 跳过原有障碍
                if (map[i][j] == 1) {
                    continue;
                }
                validPositions.add(new int[]{i, j});
            }
        }

        // 空位不足时直接抛错,避免死循环
        if (validPositions.size() < NEW_OBSTACLE_COUNT) {
            throw new IllegalStateException("地图剩余可放置障碍的空位不足20个");
        }

        Random random = new Random();
        int placed = 0;
        while (placed < NEW_OBSTACLE_COUNT) {
            // 随机选一个空位,放完障碍直接从列表移除,避免重复选点
            int randomIdx = random.nextInt(validPositions.size());
            int[] pos = validPositions.remove(randomIdx);
            map[pos[0]][pos[1]] = 1;
            placed++;
        }

        return map;
    }

    // 测试入口
    public static void main(String[] args) {
        int[][] map = {
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
                {0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
        };
        int[][] result = addRandomObstacles(map);
        // 打印结果验证
        for (int[] row : result) {
            for (int cell : row) {
                System.out.print(cell + " ");
            }
            System.out.println();
        }
    }
}

补充说明

  • 上述实现直接在传入的原数组上修改,如果需要保留原始地图数据,可以在方法开头先对原数组做深拷贝,再基于拷贝的数组加障碍
  • 当前初始地图总共有94个合法空位(100个格子减去2个起终点、4个原有障碍),完全满足放20个新障碍的要求,正常运行不会触发空位不足的报错
  • 选点时直接移除已使用的位置,不会出现同一个位置重复放障碍的问题

内容的提问来源于stack exchange,提问作者balse98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:15:46