1  using System;
   2  
   3  class GridDimensions {
   4      public GridDimensions(int width, int height) {
   5          width_ = width;
   6          height_ = height;
   7          }
   8  
   9      // ======= Data Members ========
  10      public int width_;
  11      public int height_;
  12  }
  13  
  14  
  15  class Grid {
  16      public Grid(GridDimensions gridDimensions) {
  17          gridDimensions_ = gridDimensions;
  18          grid_ = new char[gridDimensions_.width_, gridDimensions_.height_];
  19          for (int y = 0; y < gridDimensions_.height_; ++y)
  20              for (int x = 0; x < gridDimensions_.width_; ++x)
  21                  grid_[x, y] = ' '; 
  22          }
  23  
  24      public Grid(Grid rhs) {  // Copy constructor
  25          gridDimensions_ = rhs.gridDimensions_;
  26          grid_ = new char[gridDimensions_.width_, gridDimensions_.height_];
  27          for (int y = 0; y < gridDimensions_.height_; ++y)
  28              for (int x = 0; x < gridDimensions_.width_; ++x)
  29                  grid_[x, y] = rhs.grid_[x, y];
  30          }
  31  
  32      public void write() {
  33          for (int y = 0; y < gridDimensions_.height_; ++y) {
  34              for (int x = 0; x < gridDimensions_.width_; ++x)
  35                  {Console.Write(grid_[x, y]);}
  36              Console.Write('\n'); 
  37              }
  38          }
  39  
  40      public char getCell(int x, int y) {return grid_[x,y];}
  41  
  42      public void setCell(int x, int y, char c) { grid_[x, y] = c; }
  43  
  44      public Grid placeSublist(WordList sublist) {  // Recursive function
  45          string firstWord = sublist.firstWord();
  46          GridIterator gridIterator = new GridIterator(firstWord.Length, gridDimensions_); 
  47          // For each possible placement of first word ...
  48          while(gridIterator.isValid()) {
  49              if(gridIterator.canPlace(firstWord, this)) {
  50                  Grid grid = new Grid(this);
  51                  gridIterator.place(firstWord, grid);
  52                  if (sublist.hasOnlyOneWord()) return grid;
  53                  // Remove first word, and recursively place sublist:
  54                  Grid result = grid.placeSublist(new WordList(sublist));
  55                  if(result!=null) return result;
  56                  }
  57              gridIterator.increment();
  58              }
  59  
  60          return null;
  61          }
  62  
  63      // ======= Data Members ========
  64      private GridDimensions gridDimensions_;
  65      private char[,] grid_;
  66  }
  67