我编写了一个程序,用户输入二维数组的维度,然后计算机打印出具有这些维度的表格,并用0到9的随机整数填充它。然后,如果有四个连续的出现在表格中任何位置的相等整数,计算机将返回“True”。如果表中没有连续的相等整数,则返回“False”。例如:
2 5 8 7 1
3 2 9 4 7
5 1 2 0 3
8 0 1 2 7
在该表中,两个从第一个点对角地连续出现。它也可以是这样的:
9 5 3 7 0
2 5 7 3 1
8 5 0 2 9
4 5 1 7 5
在此表中,五个从第二个位置垂直向下显示。
这是我写的代码:
/*MyName*/
package fourconsecutivenumbers;
import java.util.Random;
import java.util.Scanner;
public class FourConsecutiveNumbers {
public static void main(String[] args) {
Scanner rowDimension = new Scanner(System.in);
System.out.print("Enter the number of rows: ");
int firstInput = rowDimension.nextInt();
Scanner columnDimension = new Scanner(System.in);
System.out.print("Enter the number of columns: ");
int secondInput = columnDimension.nextInt();
int[][] randomTable = new int[firstInput][secondInput];
for (int row = 0; row < firstInput; row++) {
for (int column = 0; column < secondInput; column++) {
randomTable[row][column] = (int)(Math.random() * 10 + 0);
System.out.print(randomTable[row][column] + " ");
}
System.out.println();
}
if(check_horizontal(randomTable) || check_vertical(randomTable) || check_diagonal(randomTable)){
System.out.println("True");
}
else {
System.out.println("False");
}
}
public static boolean check_vertical(int[][] randomTable) {
for (int i = 0; i<randomTable.length-3; i++){
for(int t=0; t<randomTable[0].length-3;t++){
if (randomTable[i][t]==randomTable[i][t+1] && randomTable[i][t+1]==randomTable[i][t+2] && randomTable[i][t+2]==randomTable[i][t+3]){
return true;
}
}
}
return false;
}
public static boolean check_horizontal(int[][] randomTable){
for (int i = 0; i<randomTable.length; i++){
for(int t=0; t<randomTable[0].length;t++){
if (randomTable[t][i]==randomTable[t+1][i] && randomTable[t+1][i]==randomTable[t+2][i] && randomTable[t+2][i]==randomTable[t+3][i]){
return true;
}
}
}
return false;
}
public static boolean check_diagonal(int[][] randomTable){
//check down
for (int t =0; t<randomTable.length-3; t++){
for(int i=0; i<randomTable[0].length-3;i++){
if (randomTable[i][t]==randomTable[i+1][t+1] && randomTable[i+1][t+1]==randomTable[i+2][t+2] && randomTable[i+2][t+2]==randomTable[i+3][t+3]){
return true;
}
}
}
//check up
for (int t = 3; t < randomTable.length; t++){
for(int i=0; i<randomTable[0].length-3;i++){
if (randomTable[t][i]==randomTable[t-1][i+1] && randomTable[t-1][i+1]==randomTable[t-2][i+2] && randomTable[t-2][i+2]==randomTable[t-3][i+3]){
return true;
}
}
}
return false;
}
}
现在,每当我放入不同尺寸时,错误就会出现。像5x10表或10x5表...但如果我要做一个5x5表或10x10表,它会执行。我得到的错误是......
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at fourconsecutivenumbers.FourConsecutiveNumbers.check_horizontal(FourConsecutiveNumbers.java:49)
at fourconsecutivenumbers.FourConsecutiveNumbers.main(FourConsecutiveNumbers.java:25)
Java Result: 1
我是编程新手,但我知道错误来自第49行。也许我写了for循环错了?我不知道我做错了什么,我希望有人可以告诉我我做错了什么以及如何解决它,这样我就可以学习不该做的事情。
答案 0 :(得分:2)
在check_horizontal方法中,你的i和t回到正面
if (randomTable[t][i]==randomTable[t+1][i] &&
randomTable[t+1][i]==randomTable[t+2][i] &&
randomTable[t+2][i]==randomTable[t+3][i]){
return true;
}
应该是
if (randomTable[i][t]==randomTable[i+1][t] &&
randomTable[i+1][t]==randomTable[i+2][t] &&
randomTable[i+2][t]==randomTable[i+3][t]){
return true;
}
正如评论中指出的,你的循环条件也是错误的:
for (int i = 0; i<randomTable.length; i++){
for(int t=0; t<randomTable[0].length;t++){
应该是
for (int i = 0; i<randomTable.length - 3; i++){
for(int t=0; t<randomTable[i].length;t++){
正如名称所示,这是垂直检查而不是水平检查,但是当check_vertical实际检查水平时,这不会对您的程序产生负面影响(只是您的标记)。
第一点(i和t的混淆)是由于您检查的长度i限于randomTable的长度(即行数),而t仅限于第0个数组的长度{{ 1}}(即列数)你的代码中使用i作为列的索引,t作为行的索引。
如果您将i重命名为row,并且将列重命名为:
,则可能更容易理解t < randomTable[0].length
对于第二个点循环条件不正确,因为您要将最多3个加到行索引(方括号中的第一个数字),您需要确保private int getNumberOfRows(int[][] table) { return table.length; }
private int getNumberOfColumnsInRow(int[][] table, int row) { return table[row].length }
...
for (int row = 0; row < getNumberOfRows(randomTable) - 3; row++){
for(int column = 0; column<getNumberOfColumnsInRow(randomTable,i);column++){
之后至少还有3个行。
答案 1 :(得分:0)
在check_horizontal中你交换了i和t。 从你的循环
for (int i = 0; i<randomTable.length; i++){
for(int t=0; t<randomTable[0].length;t++){
您需要使用
访问该数组randomTable[i][t]
而不是 randomTable [T] [I]