19.2 Design an algorithm to figure out if someone has won in a game of tic-tac-toe.

class TicTacToe
{
  enum Tic
  {
    X, O    
  }
  
  // Given TicTacToe map, wheter t has won the game.
  // Assume map is a not-null 3*3 matrix, containing no null elements.  
  // 
  // check row, check column, check corner
  // This is a brute force solution.  
  boolean checkRow(T[][] map, int r, T t)
  {
    for (int i = 0 ; i < 3 ; i ++)
    {
      if (map[r][i] != t)
        return false;
    }
    return true;
  }
  
  boolean checkColumn(T[][] map, int c, T t)
  {
    for (int i = 0 ; i < 3 ; i ++)
    {
      if (map[i][r] != t)
        return false;
    }
    return true;
  }
  
  boolean checkCornerLeft(T[][] map, T t)
  {
    for (int i = 0 ; i < 3 ; i ++)
    {
      if (map[i][i] != t)
        return false;
    }    
    return true;
  }
  
  boolean checkCornerRight(T[][] map, T t)
  {
    for (int i = 0 ; i < 3 ; i ++)
    {
      if (map[2 - i][i] != t)
        return false;
    }
    return true;
  }
  
  boolean won(T[][] map, T t)
  {
    // Only check first row and first column
    for (int i = 0 ; i < 3 ; i ++)
    {
      if (checkRow(map, i, t))
        return true;
      if (checkColumn(map, i, t))
        return true;
    }
    checkCornerLeft(map, t);
    checkCornerRight(map, t);
    return false;
  }
  
  // A second option is that.
  // There is 9 positions, each position has 2 choices.
  // Thus, totally there are 2^9 conditions.
  // Use bit map to represents these 2^9.
  // If won, mark it as 1.
  // Check some one won' only needs O(1)
}