using System.Collections.Generic;
public Node(T value, string name)
Connections = new List<Node<T>>();
public string Name { get; set; }
public T Value { get; private set; }
public List<Node<T>> Connections { get; private set; }
public void AddConnections(params Node<T>[] connections)
foreach (var connection in connections)
Connections.Add(connection);
public Node<T> Node { get; set; }
public string Path { get; set; }
public string PreviousUsedNodeNames { get; set; }
public class WordsGenerator
public IList<string> GenerateWords(Node<string> graph)
IList<string> generatedWords = new List<string>();
Queue<NodePath<string>> queue = new Queue<NodePath<string>>();
queue.Enqueue(new NodePath<string> { Node = graph, Path = graph.Value, PreviousUsedNodeNames = graph.Name });
var nodePath = queue.Dequeue();
foreach (var item in nodePath.Node.Connections)
if (nodePath.PreviousUsedNodeNames.Contains(item.Name))
var connectedNode = new NodePath<string>
Path = nodePath.Path + item.Value.ToString(),
PreviousUsedNodeNames = nodePath.PreviousUsedNodeNames + item.Name
queue.Enqueue(connectedNode);
generatedWords.Add(connectedNode.Path);
public class GraphBuilder
public List<Node<string>> BuildGraphs()
Node<string> nodeP1 = new Node<string>("P", "P1");
Node<string> nodeP2 = new Node<string>("P", "P2");
Node<string> nodeO1 = new Node<string>("O", "O1");
Node<string> nodeO2 = new Node<string>("O", "O2");
Node<string> nodeR = new Node<string>("R", "R");
Node<string> nodeN = new Node<string>("N", "N");
Node<string> nodeC1 = new Node<string>("C", "C1");
Node<string> nodeC2 = new Node<string>("C", "C2");
nodeP1.AddConnections(nodeO1, nodeR, nodeN);
nodeO1.AddConnections(nodeP1, nodeR, nodeO2, nodeP2);
nodeR.AddConnections(nodeP1, nodeO1, nodeN, nodeO2);
nodeN.AddConnections(nodeP1, nodeR, nodeO2, nodeC1);
nodeO2.AddConnections(nodeO1, nodeR, nodeN, nodeC1, nodeP2, nodeC2);
nodeP2.AddConnections(nodeO1, nodeO2, nodeC2);
nodeC1.AddConnections(nodeO2, nodeN, nodeC2);
nodeC2.AddConnections(nodeP2, nodeO2, nodeC1);
return new List<Node<string>>()
nodeP1, nodeO1, nodeP2, nodeC1, nodeC2, nodeN
public static void Main(string[] args)
var graphBuilder = new GraphBuilder();
var wordsGenerator = new WordsGenerator();
var generatedWords = new List<string>();
foreach (var graph in graphBuilder.BuildGraphs())
generatedWords.AddRange(wordsGenerator.GenerateWords(graph));
foreach (var word in generatedWords)
Console.WriteLine("Generated words " + generatedWords.Count);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("Specify the word to search:");
var wordToSearch = Console.ReadLine();
var wordFound = generatedWords.Contains(wordToSearch.ToUpper());
Console.WriteLine("The word " + wordToSearch.ToUpper() + " was found");
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("The word " + wordToSearch.ToUpper() + " was not found");