using System;
using System.Collections.Generic;
using System.Linq;
public class Node
{
public bool UsedOnce;
public int Id;
public bool Visited;
public Node[] Children;
public Node(int id, Node[] children)
{
UsedOnce = false;
Visited = false;
Id = id;
Children = children;
}
public Node(int id)
{
UsedOnce = false;
Visited = false;
Id = id;
Children = new Node[0];
}
}
public class Test
{
public static void DFS(Node node)
{
if (node.Children.Length == 0) // if it is a leaf (no children) - output
{
OutputAndMarkAsUsed();
return;
}
foreach (var child in node.Children)
{
if (!child.Visited) // for every not visited children call DFS
{
child.Visited = true;
currentPath.Add(child);
DFS(child);
currentPath.Remove(child);
child.Visited = false;
}
}
}
private static void OutputAndMarkAsUsed()
{
int startId = 0;
for (int i = 0; i < currentPath.Count - 1; i++)
if (currentPath[i + 1].UsedOnce == false)
{
startId = i;
break;
}
for (int i = startId; i < currentPath.Count; i++)
{
Console.Write("{0} ", currentPath[i].Id);
currentPath[i].UsedOnce = true;
}
Console.WriteLine();
return;
}
private static List<Node> currentPath = new List<Node>();
public static void Main()
{
var root = new Node(1, new [] {
new Node(2, new [] {
new Node(5),
new Node(6)
}),
new Node(3, new [] {
new Node(7)
}),
new Node(4, new [] {
new Node(8),
new Node(9)
})
});
root.Visited = true;
currentPath.Add(root);
DFS(root);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgTm9kZQp7CglwdWJsaWMgYm9vbCBVc2VkT25jZTsKICAgIHB1YmxpYyBpbnQgSWQ7CiAgICBwdWJsaWMgYm9vbCBWaXNpdGVkOwogICAgcHVibGljIE5vZGVbXSBDaGlsZHJlbjsKICAgIAogICAgcHVibGljIE5vZGUoaW50IGlkLCBOb2RlW10gY2hpbGRyZW4pCiAgICB7CiAgICAJVXNlZE9uY2UgPSBmYWxzZTsKICAgIAlWaXNpdGVkID0gZmFsc2U7CiAgICAJSWQgPSBpZDsKICAgIAlDaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgfQogICAgCiAgICBwdWJsaWMgTm9kZShpbnQgaWQpCiAgICB7CiAgICAJVXNlZE9uY2UgPSBmYWxzZTsKICAgIAlWaXNpdGVkID0gZmFsc2U7CiAgICAJSWQgPSBpZDsKICAgIAlDaGlsZHJlbiA9IG5ldyBOb2RlWzBdOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgREZTKE5vZGUgbm9kZSkKCXsKCSAgICBpZiAobm9kZS5DaGlsZHJlbi5MZW5ndGggPT0gMCkgLy8gaWYgaXQgaXMgYSBsZWFmIChubyBjaGlsZHJlbikgLSBvdXRwdXQKCSAgICB7CgkgICAgCU91dHB1dEFuZE1hcmtBc1VzZWQoKTsKCSAgICAJcmV0dXJuOwoJICAgIH0KCQoJICAgIGZvcmVhY2ggKHZhciBjaGlsZCBpbiBub2RlLkNoaWxkcmVuKQoJICAgIHsKCSAgICAgICAgaWYgKCFjaGlsZC5WaXNpdGVkKSAvLyBmb3IgZXZlcnkgbm90IHZpc2l0ZWQgY2hpbGRyZW4gY2FsbCBERlMKCSAgICAgICAgewoJICAgICAgICAgICAgY2hpbGQuVmlzaXRlZCA9IHRydWU7CgkgICAgICAgICAgICBjdXJyZW50UGF0aC5BZGQoY2hpbGQpOwoJICAgICAgICAgICAgREZTKGNoaWxkKTsgCgkgICAgICAgICAgICBjdXJyZW50UGF0aC5SZW1vdmUoY2hpbGQpOwoJICAgICAgICAgICAgY2hpbGQuVmlzaXRlZCA9IGZhbHNlOwoJICAgICAgICB9CgkgICAgfQoJfQoJCglwcml2YXRlIHN0YXRpYyB2b2lkIE91dHB1dEFuZE1hcmtBc1VzZWQoKQoJewoJCWludCBzdGFydElkID0gMDsKICAgIAlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRQYXRoLkNvdW50IC0gMTsgaSsrKQogICAgCQlpZiAoY3VycmVudFBhdGhbaSArIDFdLlVzZWRPbmNlID09IGZhbHNlKSAKICAgIAkJewogICAgCQkJc3RhcnRJZCA9IGk7CiAgICAJCQlicmVhazsKICAgIAkJfQogICAgCQogICAgCWZvciAoaW50IGkgPSBzdGFydElkOyBpIDwgY3VycmVudFBhdGguQ291bnQ7IGkrKykKICAgIAl7CiAgICAJCUNvbnNvbGUuV3JpdGUoInswfSAiLCBjdXJyZW50UGF0aFtpXS5JZCk7CiAgICAJCWN1cnJlbnRQYXRoW2ldLlVzZWRPbmNlID0gdHJ1ZTsKICAgIAl9CiAgICAgICAgCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKICAgICAgICAKICAgICAgICByZXR1cm47Cgl9CgkKCXByaXZhdGUgc3RhdGljIExpc3Q8Tm9kZT4gY3VycmVudFBhdGggPSBuZXcgTGlzdDxOb2RlPigpOwoJCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJdmFyIHJvb3QgPSBuZXcgTm9kZSgxLCBuZXcgW10gewoJCQluZXcgTm9kZSgyLCBuZXcgW10gewoJCQkJbmV3IE5vZGUoNSksCgkJCQluZXcgTm9kZSg2KQoJCQl9KSwKCQkJbmV3IE5vZGUoMywgbmV3IFtdIHsKCQkJCW5ldyBOb2RlKDcpCgkJCX0pLAoJCQluZXcgTm9kZSg0LCBuZXcgW10gewoJCQkJbmV3IE5vZGUoOCksCgkJCQluZXcgTm9kZSg5KQoJCQl9KQoJCX0pOwoJCQoJCXJvb3QuVmlzaXRlZCA9IHRydWU7CiAgICAgICAgY3VycmVudFBhdGguQWRkKHJvb3QpOwogICAgICAgIERGUyhyb290KTsgCgl9Cn0=