n×n十五数码谜题输入读取异常:空格转0位置识别错误
解决n×n数码谜题的输入读取问题
问题说明
要开发n×n十五数码谜题求解器,目前卡在输入读取环节:
- 输入文件首行是
n,代表n×n网格 - 后续每行由数字和不定数量空格组成的空位构成,无法修改原文件将空位改为0
- 需要将输入转换为二维数组,空位用
0替代,但原代码无法正确识别空位位置
3×3输入示例
3 5 1 2 8 3 4 6 7
目标输出数组
5 1 2 8 0 3 4 6 7
9×9输入示例(复杂场景)
9 38 51 15 17 11 27 8 36 7 19 40 28 10 14 4 77 26 9 43 2 5 18 71 22 20 32 13 37 34 76 6 48 25 35 44 53 1 56 65 39 70 24 62 79 42 30 74 68 58 55 45 60 33 67 29 75 3 41 59 73 63 80 47 12 31 49 50 61 57 72 16 66 23 64 21 78 54 69 52 46
错误代码
File input = new File(args[0]); Scanner scanner = new Scanner(input); int n = scanner.nextInt(); scanner.nextLine(); int[][] board = new int[n][n]; int emptyRow = -1; int emptyCol = -1; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (scanner.hasNextInt()) { board[i][j] = scanner.nextInt(); } else { // Empty space board[i][j] = 0; emptyRow = i; emptyCol = j; } } }
错误输出
5 1 2 8 3 4 6 7 0
问题原因
原代码使用Scanner.hasNextInt()判断时,Scanner默认以**任意空白(包括换行、多空格)**为分隔符,会直接跳过所有空白内容。遇到连续空格时,它不会将其识别为一个“空位”,而是继续读取下一个整数,导致后续数字错位填充,空位被挤到数组末尾。
修正方案
改为逐行读取输入,将每行按空格分割为n个元素,再逐个判断是否为空位:
修正后的代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Scanner; public class PuzzleInputReader { public static void main(String[] args) throws FileNotFoundException { File input = new File(args[0]); Scanner scanner = new Scanner(input); int n = scanner.nextInt(); scanner.nextLine(); // 读取n后的换行符 int[][] board = new int[n][n]; int emptyRow = -1; int emptyCol = -1; for (int i = 0; i < n; i++) { // 读取整行并去除首尾空白 String line = scanner.nextLine().trim(); // 按一个或多个空格分割,自动过滤连续空格 String[] elements = line.split("\\s+"); // 处理该行的n个位置 for (int j = 0; j < n; j++) { if (j < elements.length && !elements[j].isEmpty()) { board[i][j] = Integer.parseInt(elements[j]); } else { board[i][j] = 0; emptyRow = i; emptyCol = j; } } } // 打印测试结果(格式匹配目标输出) for (int[] row : board) { System.out.println(Arrays.toString(row).replaceAll("[\\[\\],]", "")); } } }
代码说明
- 逐行读取:避免Scanner跨空白的自动跳过行为,确保每行的结构被完整解析
- 正则分割:用
\\s+匹配一个或多个空格,分割后直接得到该行的有效数字字符串,不会保留空字符串 - 空位判断:对每行的n个位置逐一校验,若对应位置无有效数字,则填充
0并记录空位坐标 - 结果输出:将数组格式化为目标样式打印,方便验证
内容的提问来源于stack exchange,提问作者strugglingnewb
相关产品推荐
相关产品推荐

