Exemple #1
0
        public bool CreateNextStage()
        {
            if (pGPsel == null)
            {
                return(true);
            }
            UPuzzleMan Q = new UPuzzleMan(stageNo + 1);

            Q.GPMpre        = this; this.GPMnxt = Q;
            pGNPX_Eng.pGP   = pGPsel.Copy(stageNo + 1, 0);
            SDK_Ctrl.UGPMan = Q;
            return(false);
        }
        public void btnTransRes()
        {
            if (pGP.AnsNum == null)
            {
                return;
            }
            UPbas = UPorg.Copy(0, 0);
            UPuzzle tGP = UPorg.Copy(0, 0);

            pGNP.SDKProbLst[ID] = tGP;
            pGNP.GNPX_Eng.pGP   = tGP;

            TrPara = new int[18];
            RCX    = new int[4, 12];
            for (int k = 0; k < 9; k++)
            {
                RCX[0, k] = RCX[1, k] = k;
            }
            for (int k = 0; k < 3; k++)
            {
                RCX[0, k + 9] = RCX[1, k + 9] = k * 3;
            }
        }
        public bool AnalyzerControl(CancellationToken ct, ref int ret2, bool SolInfoB)
        {
            List <UCell> XYchainList = new List <UCell>();
            Stopwatch    AnalyzerLap = new Stopwatch();

            AnMan.GStage++;

            bool ret = false;

            try{
                pGP.Sol_ResultLong = "";
                int lvlLow = SDK_Ctrl.lvlLow;
                int lvlHgh = SDK_Ctrl.lvlHgh;
                AnMan.SolversInitialize();

                #region Solve
                int mCC = 0;
                do
                {
                    ret = AnMan.VerifyRoule_SuDoKu();
                    if (!ret)
                    {
                        if (SolInfoB)
                        {
                            pGP.Sol_ResultLong = "No solution";
                        }
                        ret2 = -999888777;
                        return(false);
                    }
                    ret = false;
                    //-------------------------------------------
LblRestart:
                    AnalyzerLap.Start();

                    DateTime MltAnsTimer = DateTime.Now;
                    UPuzzle  GPpre       = null;
                    if (SDK_Ctrl.MltAnsSearch)
                    {
                        GPpre = pGP.Copy(0, 0);
                    }
                    try{
                        if (AnMan.pBDL.All(p => (p.FreeB == 0)))
                        {
                            break;
                        }
                        pGP.SolCode = -1;
                        bool L1SolFound = false;
                        foreach (var P in MethodLst_Run)
                        {
                            if (ct != null && ct.IsCancellationRequested)
                            {
                                return(false);
                            }
                            int lvl    = P.DifLevel;
                            int lvlAbs = Abs(lvl);
                            if (lvlAbs > lvlHgh)
                            {
                                continue;
                            }
                            try{
                                if (SDK_Ctrl.MltAnsSearch) //Multiple Solutions Analysis
                                {
                                    if (L1SolFound && lvlAbs >= 2)
                                    {
                                        break;
                                    }
                                    if (lvlAbs > (int)SDK_Ctrl.MltAnsOption["MaxLevel"])
                                    {
                                        continue;
                                    }
                                    if ((string)SDK_Ctrl.MltAnsOption["abortResult"] != "")
                                    {
                                        GNPX_AnalyzerMessage = (string)SDK_Ctrl.MltAnsOption["abortResult"];
                                        break;
                                    }
                                }
                                else
                                {
                                    if (lvl < 0)
                                    {
                                        continue;           //(negative difficulty method is used only Multiple Solutions Analysis)
                                    }
                                }

                                if (__ChkPrint__)
                                {
                                    WriteLine($"---> method{(mCC++)} :{P.MethodName}");
                                }
                                GNPX_AnalyzerMessage = P.MethodName;
                                if (ct != null && ct.IsCancellationRequested) /*ct.ThrowIfCancellationRequested();*/ return {
                                    (false);
                                }
                                if (pGP.DifLevel < P.DifLevel)
                                {
                                    pGP.DifLevel = P.DifLevel;                                                      //БеTBDБе
                                }
                                if ((ret = P.Method()))
                                {
                                    if (SDK_Ctrl.UGPMan != null && SDK_Ctrl.UGPMan.MltUProbLst != null &&
                                        SDK_Ctrl.UGPMan.MltUProbLst.Any(q => q.SolCode == 1))
                                    {
                                        L1SolFound = true;
                                    }
                                    P.UsedCC++;
                                    pGP.pMethod = P;
                                    if (SDK_Ctrl.UGPMan != null && SDK_Ctrl.UGPMan.pGPsel != null)
                                    {
                                        SDK_Ctrl.UGPMan.pGPsel.pMethod = P;
                                    }

                                    if (__ChkPrint__)
                                    {
                                        WriteLine($"========================> solved {P.MethodName}");
                                    }
                                    if (!SDK_Ctrl.MltAnsSearch)
                                    {
                                        goto succeedBreak;
                                    }
                                }
                            }
                            catch (Exception e) {
                                WriteLine(e.Message + "\r" + e.StackTrace);
                                using (var fpW = new StreamWriter("Exception_201_1.txt", true, Encoding.UTF8)){
                                    fpW.WriteLine($"---{DateTime.Now} {e.Message} \r{e.StackTrace}");
                                }
                                goto LblRestart;
                            }
                        }

                        if (SDK_Ctrl.MltAnsSearch && SDK_Ctrl.UGPMan != null && SDK_Ctrl.UGPMan.MltUProbLst != null)
                        {
                            if (SDK_Ctrl.UGPMan.MltUProbLst.Count > 0)
                            {
                                pGP = SDK_Ctrl.UGPMan.MltUProbLst.First();
                                SDK_Ctrl.UGPMan.pGPsel = pGP;
                                ret = true;
                                goto succeedBreak;
                            }
                        }

                        if (__ChkPrint__)
                        {
                            WriteLine("========================> can not solve");
                        }
                        if (SolInfoB)
                        {
                            pGP.Sol_ResultLong = "can not solve";
                        }
                        ret2 = -999888777;
                        return(false);
                    }
                    catch (OperationCanceledException) {}
                    catch (Exception e) {
                        WriteLine(e.Message + "\r" + e.StackTrace);
                        using (var fpW = new StreamWriter("ExceptionXXX_2.txt", true, Encoding.UTF8)){
                            fpW.WriteLine($"---{DateTime.Now} {e.Message} \r{e.StackTrace}");
                        }
                        goto LblRestart;
                    }
                    finally{
                        AnalyzerLap.Stop();
                        SDK_Ctrl.solLevelNN = Min(SDK_Ctrl.solLevelNN, AnMan.pBDL.Count(p => (p.FreeB != 0)));
                    }
                }while(false);
            }
            catch (ThreadAbortException ex) {
                WriteLine(ex.Message + "\r" + ex.StackTrace);
            }
succeedBreak:            //found
            SdkExecTime = AnalyzerLap.Elapsed;

            #endregion Solve
            return(ret);
        }