Код выше неэффективен, потому что он имеет 4 отдельных цикла for
(для отслеживания 4 направлений, в которых вы можете выиграть: 1) слева направо, 2) сверху вниз, 3) диагональ 4) диагональ / другое направление -AND- потому что операторы if
должны проверять 4 последовательные позиции.
Чтобы оптимизировать решение, вы можете признать, что вы можете сохранить state
для how many consecutive same pieces
на каждой позиции на доске для каждого из 4 возможных направлений, которые вы можете выиграть (4 уникальных состояния).
Рассмотрим в качестве примера победу в горизонтальном направлении. При перемещении слева направо по одной и той же строке счетчик состояний увеличивается на 1, если фигура слева одинакова. Если когда-либо есть '.', Счетчик сбрасывается на 0. Если есть другой кусок, счетчик сбрасывается на 1. Вы находитесь в выигрышной позиции, если какой-либо из этих 4 счетчиков состояния достигает 4.
Приведенный ниже код завершен для выигрышных направлений по горизонтали (переменная состояния 0) и по вертикали (переменная состояния 1). Это оставлено как упражнение для завершения двух строк, которые представляют каждое из диагональных направлений (переменные состояния 2 и 3).
public static boolean determineWin(String[][] board) {
int[][][] counters = new int[board[0].length+1][board.length+1][4];
for (int y=0; y<board.length; y++) {
for (int x=0; x<board[0].length; x++) {
if (!board[y][x].equals(".")) {
counters[y][x][0] = (x>0 && board[y][x].equals(board[y][x-1])) ? counters[y][x-1][0] + 1 : 1;
counters[y][x][1] = (y>0 && board[y][x].equals(board[y-1][x])) ? counters[y-1][x][1] + 1 : 1;
// Diagonal 1 TODO: counters[y][x][2] =
// Diagonal 2 TODO: counters[y][x][3] =
if (counters[y][x][0] == 4 || counters[y][x][1] == 4 || counters[y][x][2] == 4 || counters[y][x][3] == 4)
return true;
}
}
}
return false;
}