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

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("[\\[\\],]", ""));
        }
    }
}

代码说明

  1. 逐行读取:避免Scanner跨空白的自动跳过行为,确保每行的结构被完整解析
  2. 正则分割:用\\s+匹配一个或多个空格,分割后直接得到该行的有效数字字符串,不会保留空字符串
  3. 空位判断:对每行的n个位置逐一校验,若对应位置无有效数字,则填充0并记录空位坐标
  4. 结果输出:将数组格式化为目标样式打印,方便验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:53:18