private void transformToInternalForm()
        {
            Cell[,] tmp = cells;
            cells = new Cell[width + height / 2, height];
            for (int i = 0; i < cells.GetLength(0); i++)
                for (int j = 0; j < cells.GetLength(1); j++)
                    cells[i, j] = new Cell();

            for (int i = 0; i < width; i++)
                for (int j = 0; j < height; j++)
                    cells[i + (j + 1) / 2, j] = tmp[i, j];
            width = width + (height + 1) / 2;
        }
 bool cellMatches(Cell cell, int color)
 {
     if (cond == Cond.Friend)
         return cell.ant != null && cell.ant.color == color;
     else if (cond == Cond.Foe)
         return cell.ant != null && cell.ant.color != color;
     else if (cond == Cond.FriendWithFood)
         return cell.ant != null && cell.ant.color == color && cell.ant.hasFood;
     else if (cond == Cond.FoeWithFood)
         return cell.ant != null && cell.ant.color != color && cell.ant.hasFood;
     else if (cond == Cond.Food)
         return cell.food > 0;
     else if (cond == Cond.Rock)
         return cell.type == CellType.ROCK;
     else if (cond == Cond.Home)
         return color == 0 && cell.type == CellType.RED_ANTHILL ||
                color == 1 && cell.type == CellType.BLACK_ANTHILL;
     else if (cond == Cond.FoeHome)
         return color == 1 && cell.type == CellType.RED_ANTHILL ||
                color == 0 && cell.type == CellType.BLACK_ANTHILL;
     else if (cond == Cond.FoeMarker)
         return cell.markers[1 - color] > 0;
     else if (cond >= Cond.Marker)
         return (cell.markers[color] & (1 << (cond - Cond.Marker))) != 0;
     else
         Debug.Assert(false);
     return false;
 }
 public Map(string fileName)
 {
     FileStream fs = new FileStream(fileName, FileMode.Open);
     StreamReader r = new StreamReader(fs);
     width = Int32.Parse(r.ReadLine());
     height = Int32.Parse(r.ReadLine());
     cells = new Cell[width, height];
     for (int j = 0; j < height; j++)
     {
         string[] elems =
             r.ReadLine().Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
         for (int i = 0; i < width; i++)
         {
             cells[i, j] = new Cell();
             if (elems[i] == ".")
                 cells[i, j].type = CellType.EMPTY;
             else if (elems[i] == "#")
                 cells[i, j].type = CellType.ROCK;
             else if (Char.IsDigit(elems[i][0]))
             {
                 cells[i, j].type = CellType.EMPTY;
                 cells[i, j].food = Int32.Parse(elems[i]);
             }
             else if (elems[i] == "+")
                 cells[i, j].type = CellType.RED_ANTHILL;
             else if (elems[i] == "-")
                 cells[i, j].type = CellType.BLACK_ANTHILL;
         }
     }
     r.Close();
     transformToInternalForm();
 }