1 回答
TA贡献1804条经验 获得超7个赞
上面的代码效率低下,因为它有 4 个单独for的循环(用于跟踪您可以获胜的 4 个方向:1)从左到右,2)从上到下,3)对角线 4)对角线/其他方向 -AND- 因为if语句必须检查 4 个连续的位置。
为了优化解决方案,您可以认识到您可以在棋盘中的每个位置保持已经发生的情况,对于您可以赢得的 4 个可能方向中的每一个(4 个唯一状态)state。how many consecutive same pieces
以在水平方向获胜为例。当您沿着同一行从左向右移动时,如果左侧的块相同,则状态计数器将增加 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;
}
添加回答
举报