Esempio n. 1
0
 public void BPSet(int no, Bit81 sdX, bool tfbSet = false)
 {
     _BQ[no] |= sdX; nzBit |= (1 << no);
     if (tfbSet)
     {
         foreach (var rc in sdX.IEGetRC())
         {
             tfxSet(no, rc);
         }
     }
 }
Esempio n. 2
0
        private void _generalLogicResult(UBasCov UBCc)
        {
            try{
                Bit81 Q = new Bit81();
                foreach (var P in UBCc.covUGLs)
                {
                    Q |= P.rcbn2.CompressToHitCells();
                }
                foreach (var UC in Q.IEGetRC().Select(rc => pBDL[rc]))
                {
                    UC.SetCellBgColor(SolBkCr2);
                }

                for (int rc = 0; rc < 81; rc++)
                {
                    int noB = UBCc.HB981.IsHit(rc);
                    if (noB > 0)
                    {
                        pBDL[rc].SetNoBBgColor(noB, AttCr, SolBkCr);
                    }
                }

                string msg  = "\r     BaseSet: ";
                string msgB = "";
                foreach (var P in UBCc.basUGLs)
                {
                    if (P.rcBit81 is Bit81)
                    {
                        msgB += P.tfx.tfxToString() + $"#{(P.rcBit81.no+1)} ";
                    }
                    else
                    {
                        msgB += P.UC.rc.ToRCString() + " ";
                    }
                }
                msg += ToString_SameHouseComp1(msgB);

                msg += "\r    CoverSet: ";
                string msgC = "";
                foreach (var P in UBCc.covUGLs)
                {
                    if (P.rcBit81 is Bit81)
                    {
                        msgC += P.tfx.tfxToString() + $"#{(P.rcBit81.no+1)} ";
                    }
                    else
                    {
                        msgC += P.UC.rc.ToRCString() + " ";
                    }
                }
                msg += ToString_SameHouseComp1(msgC);

                string st = $"GeneralLogic N:{UBCc.sz} rank:{UBCc.rnk}";
                Result     = st;
                msg       += $"\r\r ChkBas:{ChkBas4}/{ChkBas1}  ChkCov:{ChkCov2}/{ChkCov1}";
                ResultLong = st + msg;
            }
            catch (Exception ex) {
                WriteLine(ex.Message);
                WriteLine(ex.StackTrace);
            }
        }
            public bool Check_BaseSetCondition(Bit981 HB981)   //for sz>=2
            {
                bool niceB = false, E = false;

                jkC++;

                #region There is a link between the link and the other link group
                for (int k = 0; k < sz; k++)
                {
                    UGLink UGL  = basUGLs[k];
                    Bit981 Bcum = new Bit981();
                    for (int m = 0; m < sz; m++)
                    {
                        if (m == k)
                        {
                            continue;
                        }
                        Bcum |= basUGLs[m].rcbn2;
                    }
                    if ((Bcum & UGL.rcbn_conn2).Count <= 0)
                    {
                        goto Lreturn;                                  //false
                    }
                }
                #endregion
                GeneralLogicGen.ChkBas3++;                           //*****
                #region Every element of the number(#no) has a link
                //それぞれのリンクは、その他のリンク群と連結する。
                //リンクしないセルはrnk個数以下でなければならない。
                //if(E) for(int n=0; n<9; n++ ) WriteLine(HB981.tfx27Lst[n].ToBitString(27));
                Bit981 Q9 = HB981.Copy();
                usedLKLst.ForEach(p => HB981.tfxReset(p & 0xF, p >> 4));
                usedLKIgnrLst.ForEach(p => HB981.tfxReset(p & 0xF, p >> 4));
                //if(E) for(int n=0; n<9; n++ ) WriteLine(HB981.tfx27Lst[n].ToBitString(27));
                int QPP = 0;
                foreach (var no in noB.IEGet_BtoNo())
                {
                    Bit81 Q = Q9._BQ[no];//new Bit81(HB981._BQ[no]);
                    //if(E) WriteLine( "HB981.tfxLst[no]: "+HB981.tfx27Lst[no].ToBitString(27) );
                    foreach (var tfx in HB981.tfx27Lst[no].IEGet_tfb())
                    {
                        int bp = HB981.GetBitPattern_tfnx(no, tfx);
                        if (bp <= 0)
                        {
                            continue;
                        }
                        int nc = bp.BitCount();
                        if (nc >= 2)
                        {
                            if (E)
                            {
                                WriteLine("Q: " + Q.ToString());
                            }
                            foreach (var nx in bp.IEGet_BtoNo())
                            {
                                int rc = tfx.Get_tfx_rc(nx);
                                Q.BPReset(rc);
                            }
                            //if(E) WriteLine("Q: "+Q.ToString() );
                        }
                    }
                    QPP += Q.Count;
                }
                if (QPP <= rnk)
                {
                    niceB = true; goto Lreturn;
                }
                #endregion
                GeneralLogicGen.ChkBas3++;                           //*****

                #region There is a possibility link between the patterns of numbers n1,n2
                //数字間のリンクしないセルは、rnk*2以下でなければならない。
                if (HB981.nzBit.BitCount() >= 2)
                {
                    bool  firstB = true;
                    Bit81 Q      = null;
                    foreach (var n in HB981.nzBit.IEGet_BtoNo())
                    {
                        if (firstB)
                        {
                            Q = HB981._BQ[n]; firstB = false;
                        }
                        else
                        {
                            Q |= HB981._BQ[n];
                        }
                    }
                    foreach (var rc in Q.IEGetRC())
                    {
                        if (HB981.GetBitPattern_rcN(rc).BitCount() >= 2) //セルrcの数字間リンクがあるときは、Q9リセット
                        {
                            foreach (var no in noB.IEGet_BtoNo())
                            {
                                Q9._BQ[no].BPReset(rc);
                            }
                        }
                    }
                    int Q9cc = Q9.BitCount();
                    if (Q9cc <= rnk)
                    {
                        niceB = true; goto Lreturn;
                    }                                          //直接リンクしないセルがrnk以下のときは、次のテストに進む
                    if (Q9cc <= rnk * 2)
                    {
                        GeneralLogicGen.ChkBas1B++;                       //*****
                        foreach (var n1 in Q9.nzBit.IEGet_BtoNo())
                        {
                            foreach (var rc in Q9._BQ[n1].IEGetRC())
                            {
                                foreach (var n2 in Q9.nzBit.IEGet_BtoNo().Where(nx => nx != n1))
                                {
                                    if ((Q9._BQ[n2] & p_connectedCells[rc]).BitCount() == 0)
                                    {
                                        continue;
                                    }
                                    //リンクしないセル間を繋ぐリンクがある(”可能性あり”で次のテストに進む
                                    GeneralLogicGen.ChkBas1A++;           //*****
                                    niceB = true; goto Lreturn;
                                }
                            }
                        }
                    }
                }
                #endregion

                GeneralLogicGen.ChkBas4++;                   //*****
Lreturn:
                return(niceB);
            }