У вашего кода в текущей версии все еще есть проблемы. Во-первых, для горизонтальной / вертикальной части вы все еще делаете 4 сравнения. Вы могли исправить это в своей локальной версии, но отредактированный код в исходном вопросе все еще имеет эту проблему.
Более фундаментальная проблема заключается в том, что вы смешиваете строки и столбцы. Вам следует последовательно использовать переменные i
и j
. Иногда вы используете i
для строки, иногда для столбца. Посмотрите, как вы читаете ввод. Первое измерение вашей матрицы относится к строкам, второе - к столбцам. Учитывая комментарий в исходном коде, «горизонтальный» и «вертикальный» - это наоборот.
Если вы используете более сложные варианты использования, вы увидите, что вам не хватает вариантов. Например, следующая матрица не будет правильно обработана вашим кодом:
5 5
2 0 1 1 0
1 0 1 0 1
0 1 2 1 0
0 0 2 0 0
2 1 1 1 1
Ваши границы l oop также нуждаются в исправлении. Для быстрой проверки сделайте расчет (в уме) для пограничных случаев. В вашем случае «диагональ вверх» l oop заканчивается, когда j
равно 4
. Вы проверяете элемент с индексом [j-3][i+3]
, т.е. [1][i+3]
, но код никогда не встречает [0][i+3]
, поэтому вам не хватает первого столбца.
Вот исправленная и более согласованная версия вашего кода . Я включил несколько операторов println()
, чтобы на самом деле было видно, где находится последовательность чисел.
public static Boolean Sinexomena4(int [][] values){
// Horizontal
for (int i = 0; i < values.length; i++){
for(int j = 0; j <= values[0].length - 4; j++){
if (values[i][j] == values[i][j+1] &&
values[i][j+1] == values[i][j+2] &&
values[i][j+2] == values[i][j+3]){
System.out.println("horizontal "+i+" "+j);
return true;
}
}
}
// Vertical
for (int i = 0; i <= values.length-4; i++){
for(int j = 0; j < values[0].length; j++){
if (values[i][j] == values[i+1][j] &&
values[i+1][j] == values[i+2][j] &&
values[i+2][j] == values[i+3][j]){
System.out.println("vertical "+i+" "+j);
return true;
}
}
}
//Diagonal
//Down
for (int i = 0; i <= values.length - 4; i++){
for(int j = 0; j <= values[0].length - 4; j++){
if (values[i][j] == values[i + 1][j + 1] &&
values[i + 1][j + 1] == values[i + 2][j + 2] &&
values[i + 2][j + 2] == values[i + 3][j + 3]){
System.out.println("diag down "+i+" "+j);
return true;
}
}
}
//Up
for (int i = values.length-1; i >= 3; i--){
for(int j = 0; j <= values[0].length - 4; j++){
if (values[i][j] == values[i - 1][j + 1] &&
values[i - 1][j + 1] == values[i - 2][j + 2] &&
values[i - 2][j + 2] == values[i - 3][j + 3]){
System.out.println("diag up "+i+" "+j);
return true;
}
}
}
return false;
}
И вот еще несколько (положительных) тестов. Когда вы проводите тестирование, не забудьте также включить несколько отрицательных тестовых случаев! И не включайте только квадратичные c матрицы, используйте также неквадратичные c!
7 4
0 1 0 1
1 0 2 0
0 1 2 1
1 0 2 0
0 1 0 1
1 2 1 0
0 1 0 1
5 5
2 0 1 1 0
1 0 1 0 1
0 1 2 1 0
0 0 2 0 0
2 1 1 1 1
5 5
2 0 1 1 0
2 1 1 0 1
0 0 1 1 0
0 0 2 1 0
2 2 1 1 1