2012-10-07 5 views
3

great book에는 누군가 tic-tac-toe 게임에서 승리했는지 알아보기위한 알고리즘을 설계해야합니다. 은 다음 용액 저자가 상기 후 주어진다 : 런타임이 행과 열의 수 어레이 (및 대각선 두 합)tic tac toe 실행 시간을 O (N)로 줄입니다.

첨가하여 O (N)으로 감소 될 수

하는 것으로

나는 열심히 노력했지만 그 말의 의미를 알 수 없었다. 이 배열과 합계는 어떻게 추가됩니까? 감사 !

enum Piece { Empty, Red, Blue }; 
enum Check { Row, Column, Diagonal, ReverseDiagonal } 

Piece getIthColor(Piece[][] board, int index, int var, Check check) { 
    if (check == Check.Row) return board[index][var]; 
    else if (check == Check.Column) return board[var][index]; 
    else if (check == Check.Diagonal) return board[var][var]; 
    else if (check == Check.ReverseDiagonal)  
    return board[board.length - 1 - var][var];  

    return Piece.Empty; 
} 

Piece getWinner(Piece[][] board, int fixed_index, Check check) {  
    Piece color = getIthColor(board, fixed_index, 0, check); 
    if (color == Piece.Empty) return Piece.Empty; 
    for (int var = 1; var < board.length; var++) { 
    if (color != getIthColor(board, fixed_index, var, check)) { 
     return Piece.Empty; 
    } 
    } 
    return color; 
} 

Piece hasWon(Piece[][] board) { 
    int N = board.length; 
    Piece winner = Piece.Empty; 

    // Check rows and columns 
    for (int i = 0; i < N; i++) { 

    winner = getWinner(board, i, Check.Row); 
    if (winner != Piece.Empty) { 
     return winner; 
    }  

    winner = getWinner(board, i, Check.Column);  
    if (winner != Piece.Empty) { 
     return winner; 
    } 

    }  

    winner = getWinner(board, -1, Check.Diagonal); 
    if (winner != Piece.Empty) { 
    return winner; 
    }  

    // Check diagonal  
    winner = getWinner(board, -1, Check.ReverseDiagonal); 
    if (winner != Piece.Empty) { 
    return winner; 
    } 

    return Piece.Empty; 
} 

답변

4

새로운 조각이 보드에 배치 될 때마다, 당신은 당신이 두 선수에 대한 별도의 카운터를, 또는 + 1/-1을 사용 1.하여 해당 행, 열 및 (아마도) 대각선 카운터를 증가 .

이제 보드를 점검 할 때 O(N) (2N + 2 카운터)에서 수행 할 수있는이 카운터 중 하나가 N과 같은지 여부 만 확인하면됩니다.

2

아마 그들은 조각을 배치 할 때 해당 조각이 기여하는 각 배열의 합계를 업데이트한다는 것을 의미합니다. 즉, 해당 행과 열입니다. 그것이 대각선에 있다면, 당신은 그것도 업데이트합니다.

업데이트 측면에서 빨간색이면 1을 추가하고 파란색이면 1을 뺍니다. 카운트가 0에서 시작하면 값이 -3 또는 3에 도달하면 우승자가됩니다.

+0

그런데 플레이어가 조각을 재생할 때 업데이트하는 카운터 2 개 (또는 3 개) 만 확인하면됩니다 ... 전부는 아닙니다. – paddy

+0

아, 우리 모두 중앙 조각이 대각선에 있다는 사실을 잊어 버렸습니다! =) – paddy

관련 문제