using System.Collections.Generic;
public static void Main()
var dict = new HashSet<string> { "hot","dot","dog","lot","log" };
var ladders = findLadders(start, end, dict);
foreach (var ladder in ladders) {
foreach (var w in ladder)
private static List<LinkedList<string>> findLadders(string start, string end, HashSet<string> dict) {
var visited = new HashSet<string>();
var unvisited = new HashSet<string>();
var q = new Queue<WordNode>();
var result = new List<LinkedList<string>>();
foreach (var d in dict) unvisited.Add(d);
q.Enqueue(new WordNode(start, 0, null));
Console.WriteLine(top.Word);
var curSteps = top.Steps;
if (minSteps == 0) minSteps = top.Steps;
if (minSteps == top.Steps && minSteps != 0) {
var l = new LinkedList<string>();
l.AddFirst(top.Pre.Word);
if (preSteps < curSteps) {
unvisited.ExceptWith(visited);
var w = top.Word.ToCharArray();
for (var i = 0; i < w.Length; i++) {
for (var c = 'a'; c <= 'z'; c++) {
if (dict.Contains(w.ToString())) {
q.Enqueue(new WordNode(w.ToString(), top.Steps + 1, top));
visited.Add(w.ToString());
public string Word {get; private set;}
public int Steps {get; private set; }
public WordNode Pre {get; private set; }
public WordNode(string word, int steps, WordNode pre) {