cubes_source[cubes[i]][rand_within(6)];
 }
 
+void
+grid_set_letters (grid_t       *grid,
+                 const char    *letters)
+{
+    int i;
+    int num_cubes = grid->size * grid->size;
+    char letter;
+
+    if (strlen (letters) != num_cubes) {
+       fprintf (stderr, "Error: Invalid string for %dx%d grid. Expected %d letters: %s\n",
+                grid->size, grid->size, num_cubes, letters);
+       exit (1);
+    }
+
+    for (i = 0; i < num_cubes; i++) {
+       letter = tolower (letters[i]);
+       if (letter < 'a' || letter > 'z') {
+           fprintf (stderr, "Error: Invalid character '%c' in letters: %s\n",
+                    letters[i], letters);
+           exit (1);
+       }
+       grid->letters[i / grid->size][i % grid->size] = letter;
+    }
+}
+
 char *
 grid_string (grid_t *grid)
 {
 
 void
 grid_init (grid_t *grid, int size);
 
+void
+grid_set_letters (grid_t       *grid,
+                 const char    *letters);
+
 char *
 grid_string (grid_t *grid);
 
 
 #include "grid.h"
 #include "word-game.h"
 
+#include <string.h>
 #include <sys/time.h>
 #include <time.h>
 
 #define GAME_LENGTH (3 * 60)
 int
-main (void)
+main (int argc, char *argv[])
 {
     dict_t dict, solution;
     grid_t grid;
     struct timeval tv;
+    const char *letters = NULL;
+
+    if (argc > 1) {
+       if (argc == 2) {
+           letters = argv[1];
+       } else {
+           fprintf (stderr, "Usage: %s [letters]\n", argv[0]);
+           fprintf (stderr, "Uses the given 16 letters or else a random grid.\n");
+           return 1;
+       }
+    }
 
     gettimeofday (&tv, NULL);
     srand (tv.tv_sec ^ tv.tv_usec);
     dict_add_words_from_file (&dict, "words.txt");
 
     grid_init (&grid, 4);
+    if (letters)
+       grid_set_letters (&grid, letters);
 
     dict_init (&solution);
     grid_solve (&grid, &dict, &solution);