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;
}
添加回答
舉報