【问题标题】:Reading input into an int 2D array with varying number of columns per row将输入读入每行列数不同的 int 2D 数组
【发布时间】:2017-06-19 04:32:42
【问题描述】:

所以我们刚刚进行了一次小型实践考试,要求我们以以下格式读取输入作为非图问题的规则。实际的算法一点也不难做,但我和我的伙伴们一开始都不知道如何扫描这些输入。

4 4

1 1
1 2 3
1
1

0
2
1 1
2 2

*actual 4x4 grid here*

前两个整数表示行数(4)和列数。 (4) 所以接下来的四行表示每行的规则(1 2 3 表示第 2 行),接下来的四行表示每列的规则(2 2 表示第 4 列),依此类推。

在学习了一个学期 C 之后,我们只处理了每行具有相同列数的数组,而在这个 Java 模块学习了 4 周后,我们根本没有教我们处理这种问题。

使用 nextInt() 和双 for 循环来扫描数组本来很容易,但是如果没有零,我们就完全不走运了。

1 1 0
1 2 3
1 0 0 
1 0 0

考试结束了,但我真的很生气不知道如何解决这个问题。希望你们能提供一些见解。

【问题讨论】:

  • “所以接下来的四行表示每行的规则(第 2 行为 1 2 3)”是什么意思?例如,“规则”是什么意思?
  • 哦,我完全忽略了所有上下文,因为我的问题并不真正需要它。在问题本身中,我们得到了一个实际的网格,我们应该使用“规则”来检查网格是否提供了有效的解决方案。如果您想了解更多信息,请查看 Google 上的 nonograms

标签: java arrays multidimensional-array java.util.scanner


【解决方案1】:

在 Java 中,您可以拥有不同长度的多维数组。

试试这个:

int rows = 4; // read
int cols = 4; // read

int[][] arr = new int[rows][]; // notice how we do not tell the cols here
for(int i=0,i<arr.length;i++){
    // read line or somehow get the numbers of the line into an array
    String line = ...
    String[] splitLine = line.split(" ");
    int[] rowArr = new int[splitLine.length];
    for(int x=0;x<splitLine.length;x++){
        // assume no NumberFormatException
        rowArr[x] = Integer.parseInt(splitLine[x]);
    }
    arr[i] = rowArr;
}

那么你的数组有 4 行,但每行只有你需要的列数:

{{1, 1}, {1, 2, 3}, {1}, {1}}

这是可行的,因为在 Java 中,多维数组只是对数组的引用数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2012-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多