请求修改国际象棋骑士合法移动位置返回方法(不使用ArrayList)
解决国际象棋骑士移动返回无null数组的问题
你的问题是现有方法返回的数组包含大量null值,需要返回仅包含合法位置的数组,且不能使用ArrayList。可以通过先统计有效位置数量,再创建对应长度数组的方式解决:
实现思路
- 先遍历所有8种可能的骑士移动,统计落在8×8棋盘内的有效位置数量
- 根据统计出的数量创建对应长度的
Position数组 - 再次遍历所有移动,将合法的位置依次存入新数组
修改后的代码
public Position[] moves(Position p) { int row = p.getRow(); int col = p.getCol(); int[][] moves = {{-1,-2},{1,-2},{-1,2},{1,2},{-2,-1},{-2,1},{2,-1},{2,1}}; // 统计有效位置数量 int validCount = 0; for (int[] move : moves) { int newRow = row + move[0]; int newCol = col + move[1]; if (newRow >= 1 && newRow <= 8 && newCol >= 1 && newCol <= 8) { validCount++; } } // 创建对应长度的结果数组 Position[] validPositions = new Position[validCount]; int index = 0; // 填充有效位置到结果数组 for (int[] move : moves) { int newRow = row + move[0]; int newCol = col + move[1]; if (newRow >= 1 && newRow <= 8 && newCol >= 1 && newCol <= 8) { validPositions[index++] = new Position(newRow, newCol); } } return validPositions; }
关键说明
- 两次遍历完全基于数组操作,规避了动态集合类的使用
- 当骑士处于(1,1)位置时,会返回仅包含
(2,3)和(3,2)的长度为2的数组,完全符合需求 - 保留了原有的棋盘边界判断逻辑,仅调整了数组的创建和填充逻辑
内容的提问来源于stack exchange,提问作者rana
相关产品推荐
相关产品推荐

