Exemple #1
0
    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;
    }
Exemple #2
0
 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;
     }
 }
Exemple #3
0
 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++;
     }
 }