private void button1_Click(object sender, EventArgs e) { NineSquareElement[] elements = new NineSquareElement[9]; for (int i = 0; i < 9; i++) { int left = 0, right = 0, top = 0, bottom = 0; var textBox = FindControl("textBox" + (i + 1) + "l") as TextBox; int.TryParse(textBox.Text.Trim(), out left); textBox = FindControl("textBox" + (i + 1) + "t") as TextBox; int.TryParse(textBox.Text.Trim(), out top); textBox = FindControl("textBox" + (i + 1) + "r") as TextBox; int.TryParse(textBox.Text.Trim(), out right); textBox = FindControl("textBox" + (i + 1) + "b") as TextBox; int.TryParse(textBox.Text.Trim(), out bottom); NineSquareElement element = new NineSquareElement(left, top, right, bottom); elements[i] = element; } NineSquarePuzzle puzzle = new NineSquarePuzzle(elements); if (!NineSquarePuzzle.CheckSolvable(elements)) MessageBox.Show("Invalid Puzzle..", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); if (puzzle.Solve()) { for (int i = 0; i < 9; i++) { int left = 0, right = 0, top = 0, bottom = 0; var textBox = FindControl("textBox" + (i + 1) + "l") as TextBox; textBox.Text = puzzle.SolvedNineSquareElements[i].EdgeLeftWeight.ToString(); textBox = FindControl("textBox" + (i + 1) + "t") as TextBox; textBox.Text = puzzle.SolvedNineSquareElements[i].EdgeTopWeight.ToString(); textBox = FindControl("textBox" + (i + 1) + "r") as TextBox; textBox.Text = puzzle.SolvedNineSquareElements[i].EdgeRightWeight.ToString(); textBox = FindControl("textBox" + (i + 1) + "b") as TextBox; textBox.Text = puzzle.SolvedNineSquareElements[i].EdgeBottomWeight.ToString(); } } }
public bool BT(NineSquareElement start, ref NineSquareElement[] nineSquareElements) { int rotateCount = 0; NineSquareElement[] oldElements = null; // used here to clone current elements into oldElements Revert(ref nineSquareElements, ref oldElements); if (VerifySolved(nineSquareElements)) return true; ++nestedCount; while (start != null) { var elements = GetElementsNear(ref start, ref nineSquareElements); if (rotateCount <= 3) { if (VerifySolved(nineSquareElements)) { --nestedCount; return true; } else if (BT(start.ForwardElement, ref nineSquareElements)) { --nestedCount; // verify this particular node. return true; } else if (rotateCount <= 3) { // Check & Rotate StepsToSolve.Enqueue(new StepNode((NineSquareElement) start.Clone(), IndexOf(start, nineSquareElements), true)); NineSquarePuzzle puzzle = new NineSquarePuzzle(nineSquareElements); VisualPuzzleSolve.Enqueue(puzzle); start.RotateCW(); rotateCount++; } else if (rotateCount > 3 && start != nineSquareElements[0]) { // backtrack //Console.WriteLine("BT..."); StepsToSolve.Enqueue(new StepNode((NineSquareElement) start.Clone(), IndexOf(start, nineSquareElements), false, true)); Revert(ref oldElements, ref nineSquareElements); NineSquarePuzzle puzzle = new NineSquarePuzzle(nineSquareElements); VisualPuzzleSolve.Enqueue(puzzle); } else { --nestedCount; return false; } } else { --nestedCount; return false; } } --nestedCount; return false; }