public static void MakeFSM()
        {
            var starting_state = new VectorizeState(0, 0, 0, 0, 0);
            var starting_node  = new FSM_Node <VectorizeState>(starting_state);

            string[][] transitions = new string[][] { hat, goggles, jacket, pants, grab };

            generateFSM(starting_node, transitions);

            int traces = 0;

            var queue = new Queue <NodePath <VectorizeState> >();

            var root = new NodePath <VectorizeState>(starting_node, null);

            queue.Enqueue(root);

            while (!queue.IsEmpty())
            {
                var top = queue.Dequeue();

                var top_state = top.Node.GetValue();

                traces = checkFinishedTrace(traces, top, top_state, transitions);

                //add all new nodes to the stack
                foreach (var neighbor in top.Node.GetNeighbors())
                {
                    queue.Enqueue(new NodePath <VectorizeState>(neighbor, top));
                }
            }
        }
        private static int checkFinishedTrace(int traces, NodePath <VectorizeState> top, VectorizeState top_state, string[][] transitions)
        {
            for (int ar = 0; ar < transitions.Length; ar++)
            {
                if (top_state.States[ar] < transitions[ar].Length)
                {
                    return(traces);
                }
            }

            var stk = new Stack <NodePath <VectorizeState> >();

            NodePath <VectorizeState> ptr = top;

            while (ptr != null)
            {
                stk.Add(ptr);

                ptr = ptr.Parent;
            }

            Console.Write("Trace {0}: ", ++traces);

            while (!stk.IsEmpty())
            {
                var here = stk.Pop();
                if (here.Parent != null)
                {
                    var msg = ((FSM_Node <VectorizeState>)here.Parent.Node).GetMessage((FSM_Node <VectorizeState>)here.Node);
                    Console.Write(msg);
                    if (!stk.IsEmpty())
                    {
                        Console.Write(" -> ");
                    }
                }
            }
            Console.WriteLine();

            return(traces);
        }