public void SearchInit(ConnectedAreas _ca) { ca = _ca; numberCount = ca.numbers.Count; searchNumbers = new Area[numberCount]; ca.numbers.CopyTo(searchNumbers); areaIndexTable = new Dictionary <Area, int>(); for (int i = 0; i < numberCount; i++) { areaIndexTable[searchNumbers[i]] = i; } pointForEachNumber = new int[numberCount]; for (int i = 0; i < numberCount; i++) { pointForEachNumber[i] = Singleton.MainData.mineDatas[searchNumbers[i].pos]; } stackForEachNumber = new List <int> [numberCount]; for (int i = 0; i < numberCount; i++) { stackForEachNumber[i] = new List <int>(); } numberIndex = 0; neighbourIndex = 0; searchResults = new Dictionary <int, List <List <IndexOfList2D> > >(); stepResult = SearchingStepResult.ORIGIN; isDead = false; }
public void Backtracking() { while (numberIndex >= 0 && stackForEachNumber[numberIndex].Count == 0) { numberIndex--; } if (numberIndex < 0) { stepResult = SearchingStepResult.END; } else { var number = searchNumbers[numberIndex]; var stack = stackForEachNumber[numberIndex]; int backNeighbourIndex = stack[stack.Count - 1]; stack.RemoveAt(stack.Count - 1); var backNeighbour = number.neighbours[backNeighbourIndex]; foreach (var neighbourNumber in backNeighbour.neighbours) { int index = areaIndexTable[neighbourNumber]; pointForEachNumber[index]++; } neighbourIndex = backNeighbourIndex + 1; stepResult = SearchingStepResult.BACKTRACKING; } }
public void Step() { if (stepResult == SearchingStepResult.GETRESULT) { numberIndex--; Backtracking(); } else if (numberIndex < 0) { stepResult = SearchingStepResult.END; } else if (numberIndex >= numberCount) { var oneResult = GetMineList(); int mineCount = oneResult.Count; if (!searchResults.ContainsKey(mineCount)) { searchResults[mineCount] = new List <List <IndexOfList2D> >(); } searchResults[mineCount].Add(oneResult); stepResult = SearchingStepResult.GETRESULT; } else if (pointForEachNumber[numberIndex] == 0) { numberIndex++; neighbourIndex = 0; stepResult = SearchingStepResult.SKIPNUMBER; } else if (neighbourIndex >= searchNumbers[numberIndex].neighbours.Count) { Backtracking(); } else { var searchingNumber = searchNumbers[numberIndex]; var searchingNeighbour = searchingNumber.neighbours[neighbourIndex]; bool flag = true; foreach (var neighbourNumber in searchingNeighbour.neighbours) { int index = areaIndexTable[neighbourNumber]; if (pointForEachNumber[index] == 0) { flag = false; break; } } if (flag) { foreach (var neighbourNumber in searchingNeighbour.neighbours) { int index = areaIndexTable[neighbourNumber]; pointForEachNumber[index]--; } var stack = stackForEachNumber[numberIndex]; stack.Add(neighbourIndex); stepResult = SearchingStepResult.PUSHSTACK; } else { stepResult = SearchingStepResult.NORMAL; } neighbourIndex++; } }