如何向二维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
相关产品推荐
相关产品推荐

