private int guess() {
    for (int i = s; i > 0; i--) {
      for (int j = 0; j < s; j++) {
        for (int k = 0; k < s; k++) {

          if (!grid.cellFilled(j, k) && grid.possible(j, k, i)) {
            grids.push(grid.clone());
            guesses.push(new int[] {j, k, i});
            //                        System.out.println("guessing row: "+j+" col: "+k+" is "+i );
            //                        System.out.println(grids.size() + "");
            int r = grid.setCellVal(j, k, i);
            //                        System.out.println(grid);
            if (r == 1) {
              System.out.println("solved");
              return 1;
            } else if (r == -1) {
              while (r == -1) {
                if (grids.isEmpty()) {
                  System.out.println("unsolvable");
                  return -1;
                }
                int[] lastGuess = guesses.pop();
                //                                System.out.println("bad guess, removing
                // possibility of row: " + lastGuess[0] + " col: " + lastGuess[1] + " being " +
                // lastGuess[2]);
                //                                System.out.println(grid);
                grid = grids.pop();
                //                                System.out.println(grids.size() + "");
                r = grid.setCellNot(lastGuess[0], lastGuess[1], lastGuess[2]);
              }
              return r;
            } else {
              System.out.println("not enough info");
              return 0;
            }
          }
        }
      }
    }
    return -1;
  }