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); } } }
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); }