private void chainRecurse(Stack<ArrayList<Point>> visited, int score, WordBuilder wb) {
		if (Thread.currentThread().isInterrupted()) {
			return;
		}
		if (wb.grid.cellsRemaining() == 0) {
			score += 500;
		}
		wc.grid = wb.grid;
		Collections.sort(wb.buildWordList(), wc);
		if (Thread.currentThread().isInterrupted()) {
			return;
		}
		System.out.println(wb.words.size() + " : " + score);
		if (wb.words.size() == 0 && score > this.bestScore) {
			this.bestScore = score;
			this.processChain(visited, score);
		}
		if (wb.words.size() > 0) {
			int n = Math.min(wb.words.size(), 2);
			for (ArrayList<Point> word : wb.words.subList(0, n)) {
				visited.push(word);
				int wordScore = WordBuilder.scoreWord(wb.grid.pointsToString(word));
				Grid newGrid = wb.grid.clone();
				newGrid.removeLetters(word);
				chainRecurse(visited, score + wordScore, new WordBuilder(wb.dictionary, newGrid));
				if (Thread.currentThread().isInterrupted()) {
					return;
				}
				visited.pop();
			}
		}
		if (Thread.currentThread().isInterrupted()) {
			return;
		}
		// All words processed so return
		this.chainsProcessed++;
	}