Mercurial > defical
comparison defical-sharp/libbacktrack/walk.cs @ 0:ebed2bd0d300
Initial import from svn. History be damned.
| author | Edho P. Arief <me@myconan.net> |
|---|---|
| date | Fri, 02 Apr 2010 23:11:57 +0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:ebed2bd0d300 |
|---|---|
| 1 using System.Collections.Generic; | |
| 2 | |
| 3 namespace libbacktrack | |
| 4 { | |
| 5 public partial class Backtrack | |
| 6 { | |
| 7 private void walk() | |
| 8 { | |
| 9 if (this.myGraph.MinDef() <= this.myGraph.NumVerDef) | |
| 10 { | |
| 11 this.isProcessing = true; | |
| 12 walk(1); | |
| 13 } | |
| 14 } | |
| 15 private void walk(int currentLevel) | |
| 16 { | |
| 17 if (this.isProcessing) | |
| 18 { | |
| 19 if (currentLevel >= this.myGraph.NumVerMain) | |
| 20 { | |
| 21 if (this.myGraph.IsSemt()) | |
| 22 { | |
| 23 if (!this.isRecurseAll) | |
| 24 this.isProcessing = false; | |
| 25 this.result += this.myGraph.Print(0); | |
| 26 this.result += "\n" + this.myGraph.Print(1)+"\n"; | |
| 27 this.isSemt = true; | |
| 28 } | |
| 29 removeLabel(currentLevel - 1); | |
| 30 } | |
| 31 else | |
| 32 { | |
| 33 List<int> availableLabels = new List<int>(); | |
| 34 int start = 1, end = this.myGraph.NumVerTotal; | |
| 35 if (currentLevel == 1 && this.firstLabel != this.myGraph.NumVerTotal) | |
| 36 { | |
| 37 if (this.myGraph.GraphType == "wheel") | |
| 38 start = end; //optimization for wheel | |
| 39 else if (this.myGraph.GraphType == "doublefan") | |
| 40 start = this.firstLabel + 1; //optimization for doublefan | |
| 41 } | |
| 42 else if (this.pathStart != 0) | |
| 43 { | |
| 44 if (currentLevel == this.pathEnd) | |
| 45 start = this.pathLabel + 1; //remove possibility for reversed path labeling | |
| 46 else if (currentLevel == this.pathStart && start < end) | |
| 47 end = this.myGraph.NumVerTotal - 1; //no need to test last label as it'll be checked already on all previous cases | |
| 48 } | |
| 49 for (int i = start; i <= end; i++) | |
| 50 if (!this.labelVerUsed[i]) | |
| 51 availableLabels.Add(i); | |
| 52 if (availableLabels.Count > 0) | |
| 53 { | |
| 54 for (int x = availableLabels.Count - 1; x >= 0; x--) | |
| 55 { | |
| 56 if (currentLevel == this.pathStart && this.pathStart != 0) | |
| 57 this.pathLabel = availableLabels[x]; | |
| 58 if (this.myGraph.IsValidToLabel(currentLevel, availableLabels[x])) | |
| 59 { | |
| 60 setLabel(currentLevel, availableLabels[x]); | |
| 61 walk(currentLevel + 1); | |
| 62 } | |
| 63 if (!this.isProcessing) | |
| 64 break; | |
| 65 } | |
| 66 } | |
| 67 if (currentLevel != 1) { removeLabel(currentLevel - 1); } | |
| 68 } | |
| 69 } | |
| 70 } | |
| 71 } | |
| 72 } |
