Description: Design an algorithm to check if some one has won a tic-tac-toe game.
Thought: I think the solution CTCI gives is not clear and understandable. Try the following one.
Code:
public class TripleT {
enum State{Blank, X, O};
int n = 3;
State[][] board = new State[n][n];
int moveCount;
void Move(int x, int y, State s){ // someone puts in (x, y)
if(board[x][y] == State.Blank) board[x][y] = s;
moveCount++;
for(int i = 0; i < n; i++){ // check row
if(board[x][i] != s) break;
if(i == n-1) //report win for s
}
for(int i = 0; i < n; i++){ // check col
if(board[i][y] != s) break;
if(i == n-1) //report win for s
}
if(x == y){ //
check diag
for(int i = 0; i < n; i++){
if(board[i][i] != s) break;
if(i == n-1) //report win for s
}
}
if(x + y == n - 1){ //check anti diag
for(int i = 0; i < n; i++){
if(board[i][(n-1)-i] != s) break;
if(i == n-1) //report win for s
}
}
//check draw
if(moveCount == (n^2 - 1)) //report draw
}
}
Thought: There should also be a O(1) solution for every new move.
public class TripleT {
enum State{Blank, X, O};
int n = 3;
State[][] board = new State[n][n];
int moveCount;
int[] result = new int[2 * n + 2];
void Move(int x, int y, State s){ // someone puts in (x, y)
moveCount++;
if (s == State.X) {
result[x]++;
if (result[x] == n) //report win for X
result[n + y]++;
if (result[n + y] == n) //report win for X
if (x == y) result[2 * n]++;
if (result[2 * n] == n) //report win for X
if (x == n - 1 - y) result[2 * n + 1]++;
if (result[2 * n + 1] == n) //report win for X
}
if (s == State.O) {
result[x]--;
if (result[x] == -n) //report win for O
result[n + y]--;
if (result[n + y] == -n) //report win for O
if (x == y) result[2 * n]--;
if (result[2 * n] == -n) //report win for O
if (x == n - 1 - y) result[2 * n + 1]--;
if (result[2 * n + 1] == -n) //report win for O
}
//check draw
if(moveCount == (n^2 - 1)) //report draw
}
}
No comments:
Post a Comment