O won = >
row 0 => matrix[0][0] ='O'
matrix[0][1] ='O'
matrix[0][2] ='O' => return 'O'
row 1 => matrix[1][0] ='X'
matrix[1][1] ='X'
matrix[1][2] ='' => return EMPTY
row 2 => matrix[2][0] ='X'
matrix[2][1] ='' => return EMPTY
matrix[2][2] =''
OOO
XX
X
2. Implementation
1. Call Once :
2. Call Multiple Times: amortizing the cost by designing your own data storage system for the tic-tac-board
// Approach#1 : If hasWon is called many times
// There are only 3^9, or about twenty thousand tic-tac-toe boards
// every cell has O, X or empty choices. There are 9 cells and so there
// are 3^9 boards
// We can represent our tic-tac-toe board as an int, with each digit
// representing a piece (0 menas Empty, 1 means Red, 2 means Blue)
// We set up a hashtable or array in advance with all possible boards
// as keys, and the values are 0,1 and 2. Our function then is simply
// this
// OOO
// XX
//
// => O Won= > O means 1
int hasWon(int board)
{
return winnerHashtable[board];
}
// Approach#2: If hasWon is called only once
// check every column, row, diagonal, reverse diagonal, if any of
// Piece continue
enum Piece{Empty, Red, Blue}
enum Check {Row ,Column, Diagonal, ReverseDiagonal}
Piece getIthColor(Piece[][] board, int RowOrColindex, int offset, Check check)
{
if ( check == Check.Row ) return board[RowOrColindex][offset];
else if ( check == Check.column ) return board[offset][RowOrColindex];
else if ( check == Check.Diagonal ) return board[offset][offset];
else if ( check == Check.ReverseDiagonal ) return board[offset][board.length -1 - offset];
return Piece.Empty;
}
Piece getWinner(Piece[][] board, int RowOrColindex, Check check)
{
// STEP1 : get the first cell's piece
Piece color = getIthColor(board, RowOrColindex, 0, check);
if ( color == Piece.Empty ) return Piece.Empty;
// STEP2 : get the rest cell's piece and compare
offset =1; offset < board.length; offset++)
{
if ( color != getIthColor(board, RowOrColindex, offset, check) )
{
return Piece.Empty;
}
}
return color;
}
Piece hasWon(Piece[][] board)
{
int N = board.length;
Piece winner = Piece.Empty;
// Case1: 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;
}
// Case2: check diagonal
winner = getWinner(board, -1, Check.Diagonal);
if ( winner != Piece.Empty )
return winner;
// Case3: check reverse diagonal
winner = getWinner(board, -1, Check.ReverseDiagonal);
if ( winner != Piece.Empty )
return winner;
return Piece.Empty;
}
3. Similar Ones
1. O(N) with the addition of row and column count arrays( and two sums for the diagonals)
2. A common follow up (or tweak) to this question is to write this code for an NxN board
No comments:
Post a Comment