Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 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;
 }