using System;
using System.Collections.Generic;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
// 0 1 2 3 4 5 6
int[,] matrix = { {0, 1, 1, 0, 0, 0, 0},
{1, 0, 0, 1, 1, 1, 0},
{1, 0, 0, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 0, 1},
{0, 1, 0, 0, 0, 0 ,0},
{0, 0, 1, 1, 1, 0, 0} };
bool[] visitMatrix = new bool[matrix.GetLength(0)];
Program ghDemo = new Program();
for (int lpRCnt = 0; lpRCnt < matrix.GetLength(0); lpRCnt++)
{
for (int lpCCnt = 0; lpCCnt < matrix.GetLength(1); lpCCnt++)
{
Console.Write(string.Format(" {0} ", matrix[lpRCnt, lpCCnt]));
}
Console.WriteLine();
}
Console.Write("\nDFS Recursive : ");
ghDemo.DftRecursive(matrix, visitMatrix, 0);
Console.Write("\nDFS Iterative : ");
ghDemo.DftIterative(matrix, 0);
Console.Read();
}
//====================================================================================================================================
public void DftRecursive(int[,] srcMatrix, bool[] visitMatrix, int vertex)
{
visitMatrix[vertex] = true;
Console.Write(vertex + " ");
for (int neighbour = 0; neighbour < srcMatrix.GetLength(0); neighbour++)
{
if (visitMatrix[neighbour] == false && srcMatrix[vertex, neighbour] == 1)
{
DftRecursive(srcMatrix, visitMatrix, neighbour);
}
}
}
public void DftIterative(int[,] srcMatrix, int srcVertex)
{
bool[] visited = new bool[srcMatrix.GetLength(0)];
Stack<int> vertexStack = new Stack<int>();
vertexStack.Push(srcVertex);
while (vertexStack.Count > 0)
{
int vertex = vertexStack.Pop();
if (visited[vertex]) continue;
Console.Write(vertex + " ");
visited[vertex] = true;
for (int neighbour = srcMatrix.GetLength(0) - 1; neighbour >= 0; neighbour--)
//for (int neighbour = 0; neighbour < srcMatrix.GetLength(0); neighbour++)
{
if (srcMatrix[vertex, neighbour] == 1 && visited[neighbour] == false)
{
vertexStack.Push(neighbour);
// Try jumping to neighbour, will miss other neighbour in the current loop, here recursion wins with backtracing.
//vertex = neighbour;
}
}
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCm5hbWVzcGFjZSBSZXh0ZXN0ZXIKewogICAgcHVibGljIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwICAxICAyICAzICA0ICA1ICA2CiAgICAgICAgICAgIGludFssXSBtYXRyaXggPSB7ICAgICB7MCwgMSwgMSwgMCwgMCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMCwgMCwgMSwgMSwgMSwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MSwgMCwgMCwgMCwgMCwgMCwgMX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMCwgMCwgMCwgMCwgMX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMCwgMCwgMCwgMCwgMX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMCwgMCwgMCwgMCAsMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMSwgMSwgMSwgMCwgMH0gIH07CgogICAgICAgICAgICBib29sW10gdmlzaXRNYXRyaXggPSBuZXcgYm9vbFttYXRyaXguR2V0TGVuZ3RoKDApXTsKICAgICAgICAgICAgUHJvZ3JhbSBnaERlbW8gPSBuZXcgUHJvZ3JhbSgpOwoKICAgICAgICAgICAgZm9yIChpbnQgbHBSQ250ID0gMDsgbHBSQ250IDwgbWF0cml4LkdldExlbmd0aCgwKTsgbHBSQ250KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IGxwQ0NudCA9IDA7IGxwQ0NudCA8IG1hdHJpeC5HZXRMZW5ndGgoMSk7IGxwQ0NudCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoc3RyaW5nLkZvcm1hdCgiIHswfSAgIiwgbWF0cml4W2xwUkNudCwgbHBDQ250XSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiXG5ERlMgUmVjdXJzaXZlIDogIik7CiAgICAgICAgICAgIGdoRGVtby5EZnRSZWN1cnNpdmUobWF0cml4LCB2aXNpdE1hdHJpeCwgMCk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlxuREZTIEl0ZXJhdGl2ZSA6ICIpOwogICAgICAgICAgICBnaERlbW8uRGZ0SXRlcmF0aXZlKG1hdHJpeCwgMCk7CgogICAgICAgICAgICBDb25zb2xlLlJlYWQoKTsKICAgICAgICB9CgogICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgICAgIHB1YmxpYyB2b2lkIERmdFJlY3Vyc2l2ZShpbnRbLF0gc3JjTWF0cml4LCBib29sW10gdmlzaXRNYXRyaXgsIGludCB2ZXJ0ZXgpCiAgICAgICAgewogICAgICAgICAgICB2aXNpdE1hdHJpeFt2ZXJ0ZXhdID0gdHJ1ZTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSh2ZXJ0ZXggKyAiICAiKTsKCiAgICAgICAgICAgIGZvciAoaW50IG5laWdoYm91ciA9IDA7IG5laWdoYm91ciA8IHNyY01hdHJpeC5HZXRMZW5ndGgoMCk7IG5laWdoYm91cisrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodmlzaXRNYXRyaXhbbmVpZ2hib3VyXSA9PSBmYWxzZSAmJiBzcmNNYXRyaXhbdmVydGV4LCBuZWlnaGJvdXJdID09IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRGZ0UmVjdXJzaXZlKHNyY01hdHJpeCwgdmlzaXRNYXRyaXgsIG5laWdoYm91cik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIERmdEl0ZXJhdGl2ZShpbnRbLF0gc3JjTWF0cml4LCBpbnQgc3JjVmVydGV4KQogICAgICAgIHsKICAgICAgICAgICAgYm9vbFtdIHZpc2l0ZWQgPSBuZXcgYm9vbFtzcmNNYXRyaXguR2V0TGVuZ3RoKDApXTsKCiAgICAgICAgICAgIFN0YWNrPGludD4gdmVydGV4U3RhY2sgPSBuZXcgU3RhY2s8aW50PigpOwogICAgICAgICAgICB2ZXJ0ZXhTdGFjay5QdXNoKHNyY1ZlcnRleCk7CgogICAgICAgICAgICB3aGlsZSAodmVydGV4U3RhY2suQ291bnQgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgdmVydGV4ID0gdmVydGV4U3RhY2suUG9wKCk7CgogICAgICAgICAgICAgICAgaWYgKHZpc2l0ZWRbdmVydGV4XSkgY29udGludWU7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKHZlcnRleCArICIgICIpOwogICAgICAgICAgICAgICAgdmlzaXRlZFt2ZXJ0ZXhdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgIGZvciAoaW50IG5laWdoYm91ciA9IHNyY01hdHJpeC5HZXRMZW5ndGgoMCkgLSAxOyBuZWlnaGJvdXIgPj0gMDsgbmVpZ2hib3VyLS0pCiAgICAgICAgICAgICAgICAvL2ZvciAoaW50IG5laWdoYm91ciA9IDA7IG5laWdoYm91ciA8IHNyY01hdHJpeC5HZXRMZW5ndGgoMCk7IG5laWdoYm91cisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChzcmNNYXRyaXhbdmVydGV4LCBuZWlnaGJvdXJdID09IDEgJiYgdmlzaXRlZFtuZWlnaGJvdXJdID09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4U3RhY2suUHVzaChuZWlnaGJvdXIpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkganVtcGluZyB0byBuZWlnaGJvdXIsIHdpbGwgbWlzcyBvdGhlciBuZWlnaGJvdXIgaW4gdGhlIGN1cnJlbnQgbG9vcCwgaGVyZSByZWN1cnNpb24gd2lucyB3aXRoIGJhY2t0cmFjaW5nLiAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmVydGV4ID0gbmVpZ2hib3VyOyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0=