public Dictionary<ConnectedAreas, List<IndexOfList2D>> FindFinalSolution(Dictionary<ConnectedAreas, Dictionary<int, MinesWithDifference>> table, int insideAreaCount, int allMineCount, int insideMineCount) { Dictionary<ConnectedAreas, List<IndexOfList2D>> solution = null; List<ConnectedAreas> caList = new List<ConnectedAreas>(table.Keys); if(caList.Count == 0) return null; Dictionary<ConnectedAreas, List<int>> caTable = new Dictionary<ConnectedAreas, List<int>>(); List<int> stack = new List<int>(); foreach(var ca in caList) { caTable[ca] = new List<int>(table[ca].Keys); caTable[ca].Sort(); } int sum = 0; int caIndex = 0; int minesIndex = 0; int minDifference = 0; while(true) { if(caIndex < caList.Count && minesIndex < caTable[caList[caIndex]].Count && caTable[caList[caIndex]][minesIndex] + sum <= allMineCount) { var ca = caList[caIndex]; var mineCount = caTable[ca][minesIndex]; if(caIndex == caList.Count - 1 && mineCount + sum + insideAreaCount < allMineCount) { minesIndex++; }else{ stack.Add(minesIndex); sum += mineCount; caIndex++; minesIndex = 0; } }else{ if(caIndex >= caList.Count) { Dictionary<ConnectedAreas, List<IndexOfList2D>> newSolution = new Dictionary<ConnectedAreas, List<IndexOfList2D>>(); int difference = 0; int tempSum = 0; int stackIndex= 0; for(;stackIndex < stack.Count; stackIndex++) { var ca = caList[stackIndex]; int mineCount = caTable[ca][stack[stackIndex]]; tempSum += mineCount; MinesWithDifference mwd = table[ca][mineCount]; difference += mwd.difference; newSolution[ca] = mwd.mines; } difference += Mathf.Abs(tempSum + insideMineCount - allMineCount); if(solution == null || difference < minDifference) { minDifference = difference; solution = newSolution; } } if(stack.Count == 0) break; int lastIndex = stack[stack.Count - 1]; stack.RemoveAt(stack.Count - 1); caIndex--; sum -= caTable[caList[caIndex]][lastIndex]; minesIndex = lastIndex + 1; } } return solution; }
public Dictionary<ConnectedAreas, Dictionary<int, MinesWithDifference>> GetMinDifferenceResults(ConnectedAreas mainCa) { var table = new Dictionary<ConnectedAreas, Dictionary<int, MinesWithDifference>>(); foreach(var ca in sfcas.Keys) { table[ca] = new Dictionary<int, MinesWithDifference>(); foreach(var keyAndValue in sfcas[ca].searchResults) { int mineCount = keyAndValue.Key; List<IndexOfList2D> minDifference = null; int minDifferenceValue = 0; foreach(var mines in keyAndValue.Value) { if(ca != mainCa || !CheckContainClickPos(mines)) { int difference = CalculateDifference(ca, mines); if(minDifference == null || difference < minDifferenceValue) { minDifference = mines; minDifferenceValue = difference; } } } if(minDifference != null) { table[ca][mineCount] = new MinesWithDifference(minDifferenceValue, minDifference); } } } return table; }