private int EdgeCoverage(int x, int y, bool[,] continuousVisited, bool[,] edgesVisited, Color[,] board) { continuousVisited.SetAt(x, y, true); Color thisColor = board.GetAt(x, y); int result = 0; if (board.CanGetLeft(x) && !continuousVisited.GetLeftOf(x, y)) { if (thisColor == board.GetLeftOf(x, y)) result += EdgeCoverage(x - 1, y, continuousVisited, edgesVisited, board); else if (!edgesVisited.GetLeftOf(x, y)) { edgesVisited.SetLeftOf(x, y, true); result++; } } if (board.CanGetAbove(y) && !continuousVisited.GetAboveOf(x, y)) { if (thisColor == board.GetAboveOf(x, y)) result += EdgeCoverage(x, y - 1, continuousVisited, edgesVisited, board); else if (!edgesVisited.GetAboveOf(x, y)) { edgesVisited.SetAboveOf(x, y, true); result++; } } if (board.CanGetRight(x) && !continuousVisited.GetRightOf(x, y)) { if (thisColor == board.GetRightOf(x, y)) result += EdgeCoverage(x + 1, y, continuousVisited, edgesVisited, board); else if (!edgesVisited.GetRightOf(x, y)) { edgesVisited.SetRightOf(x, y, true); result++; } } if (board.CanGetBelow(y) && !continuousVisited.GetBelowOf(x, y)) { if (thisColor == board.GetBelowOf(x, y)) result += EdgeCoverage(x, y + 1, continuousVisited, edgesVisited, board); else if (!edgesVisited.GetBelowOf(x, y)) { edgesVisited.SetBelowOf(x, y, true); result++; } } return result; }
//private static TreeNode[,] ToTreeNode(MapNode[,] lookup) //{ // TreeNode[,] treeLookup = new TreeNode[lookup.Height(), lookup.Width()]; // for (int y = 0; y < lookup.Height(); y++) // { // for (int x = 0; x < lookup.Width(); x++) // { // TreeNode treeNode = new TreeNode(lookup.GetAt(x, y).Color); // treeLookup.SetAt(x, y, treeNode); // throw new NotImplementedException("Doesn't keep the same reference for touching colors"); // } // } // return treeLookup; //} private static MapNode[,] BuildLookupGrid(Color[,] board) { MapNode[,] lookup = new MapNode[board.Height(), board.Width()]; //build lookup for (int y = 0; y < board.Height(); y++) { for (int x = 0; x < board.Width(); x++) { //Create MapNode bool isLeftSame = board.CanGetLeft(x) && board.GetAt(x, y) == board.GetLeftOf(x, y); bool isAboveSame = board.CanGetAbove(y) && board.GetAt(x, y) == board.GetAboveOf(x, y); if (isLeftSame && isAboveSame) //check above & to the left { MapNode left = lookup.GetLeftOf(x, y); MapNode above = lookup.GetAboveOf(x, y); lookup.SetAt(x, y, left); if (left != above) { left.Merge(above); //update "above's" references to left for (int updateY = y; updateY >= 0; updateY--) { for (int updateX = x; updateX >= 0; updateX--) { if (lookup.GetAt(updateX, updateY) == above) lookup.SetAt(updateX, updateY, left); } } } } else if (isLeftSame) // check to the left { lookup.SetAt(x, y, lookup.GetLeftOf(x, y)); } else if (isAboveSame) // check above { lookup.SetAt(x, y, lookup.GetAboveOf(x, y)); } else { lookup.SetAt(x, y, new MapNode(board.GetAt(x, y))); } } } return lookup; }