public string __chainToStringGNLsub(List <GroupedLink> SolLst, ref string st3) { string po = $"[{SolLst[0].UGCellsA}]"; foreach (var LK in SolLst) { string ST_LinkNo = ""; ALSLink ALK = LK as ALSLink; if (ALK != null) { ST_LinkNo = $"-#{(ALK.no+1)}ALS<{ALK.ALSbase.ToStringRC()}>#{(ALK.no2+1)}-"; } else { string mk = (LK.type == 1)? "=": "-"; ST_LinkNo = mk + (LK.no2 + 1) + mk; } po += $"{ST_LinkNo}[{LK.UGCellsB}]"; } if (po.Contains("ALS") || po.Contains("[<")) { st3 = "Grouped "; } return(po); }
public string GrLKToString() { try{ string P = "+", M = "-"; if (type == 1) { P = "-"; M = "+"; } string st = "["; #if DEBUG if (_IDsetB) { st += "ID:" + ID + " "; } #endif st += (type == 1? "S": "W") + " "; if (this is ALSLink) { ALSLink A = this as ALSLink; string po = ""; A.ALSbase.UCellLst.ForEach(p => { po += " r" + (p.r + 1) + "c" + ((p.c) + 1); }); st += "(ALS:" + po.ToString_SameHouseComp() + ") "; } st += UGCellsA.ToString() + "/" + P + (no + 1); st += " -> " + UGCellsB.ToString() + "/" + M + (no2 + 1) + "]"; return(st); } catch (System.NullReferenceException ex) { WriteLine(ex.Message); } return("null Exception"); }
private string _ToGroupedRCSequenceString(Stack <GroupedLink> SolStack, ref string st3) { if (SolStack.Count == 0) { return("[rc]:-"); } List <GroupedLink> SolLst = SolStack.ToList(); SolLst.Reverse(); string po = $"[{SolLst[0].UGCellsA}]"; foreach (var LK in SolLst) { string ST_LinkNo = ""; ALSLink ALK = LK as ALSLink; if (ALK != null) { ST_LinkNo = $"-#{(ALK.no+1)}ALS<{ALK.ALSbase.ToStringRC()}>#{(ALK.no2+1)}-"; } else { string mk = (LK.type == 1)? "=": "-"; ST_LinkNo = mk + (LK.no2 + 1) + mk; } po += $"{ST_LinkNo}[{LK.UGCellsB}]"; } if (po.Contains("ALS") || po.Contains("[<")) { st3 = "Grouped "; } return(po); }
public new int CompareTo(object obj) { ALSLink Q = obj as ALSLink; int ret = this.UGCellsA.CompareTo(Q.UGCellsA); if (ret != 0) { return(ret); } return(this.UGCellsB.CompareTo(Q.UGCellsB)); }
public override bool Equals(object obj) { ALSLink Q = obj as ALSLink; if (Q == null) { return(true); } // if( this.tfx!=Q.tfx ) return false; if (!this.UGCellsA.Equals(Q.UGCellsA)) { return(false); } if (!this.UGCellsB.Equals(Q.UGCellsB)) { return(false); } return(true); }
private void _SetGroupedLink(UALS P, UGrCells GS, UGrCells GD, int tfx) { ALSLink ALSLK = new ALSLink(P, GS, GD, tfx); if (AlsInnerLink == null) { AlsInnerLink = new List <ALSLink>(); } if (AlsInnerLink.Count > 0) { int ix = AlsInnerLink.FindIndex(Q => (Q.Equals(ALSLK))); if (ix >= 0) { return; } } AlsInnerLink.Add(ALSLK); //WriteLine( $"ALSLink {GS.GCToString()} -> tfx:{tfx} {GD.GCToString()}" ); }
public string _chainToStringGNL(USuperLink GNL_Result, ref string st3) { string st = ""; if (GNL_Result == null) { return(st); } GroupedLink GLKnxt = GNL_Result.resultGLK; //pSprLKsMan.Debug_ChainPrint(GLKnxt); var SolLst = pSprLKsMan.Convert_ChainToList_GNL(GNL_Result); GroupedLink GLKorg = SolLst[0]; {//===================== cells coloring =========================== foreach (var LK in SolLst) { bool bALK = LK is ALSLink; int type = (LK is ALSLink)? S: LK.type;//ALSLink, in ALS, is S foreach (var P1 in LK.UGCellsA.Select(p => pBDL[p.rc])) { //WriteLine($"---------- {P1}"); int noB = (1 << LK.no); if (!bALK) { P1.SetCellBgColor(SolBkCr); } if (type == S) { P1.SetNoBColor(noB, AttCr2); } else { P1.SetNoBColor(noB, AttCr3); } } if (type == W) { foreach (var P2 in LK.UGCellsB.Select(p => pBDL[p.rc])) { int noB2 = (1 << LK.no); if (!bALK) { P2.SetCellBgColor(SolBkCr); } P2.SetNoBColor(noB2, AttCr); } } } int cx = 2; foreach (var LK in SolLst) // ALS { ALSLink ALK = LK as ALSLink; if (ALK == null) { continue; } Color crG = _ColorsLst[cx++]; foreach (var P in ALK.ALSbase.B81.IEGet_rc().Select(rc => pBDL[rc])) { P.SetCellBgColor(crG); } } } {//===================== result report =========================== st3 = ""; int SolType = GNL_Result.contDiscontF; if (SolType == 1) { st = "Nice Loop(Cont.)"; //<>continuous } else //<>discontinuous { int rc = GLKorg.UGCellsA[0].rc; var P = pBDL[rc]; st = "Nice Loop(Discont.) r" + (rc / 9 + 1) + "c" + (rc % 9 + 1); int dcTyp = GLKorg.type * 10 + GLKnxt.type; switch (dcTyp) { case 11: st += $" is {(GLKorg.no+1)}"; P.SetCellBgColor(SolBkCr2); break; case 12: st += $" is not {(GLKnxt.no+1)}"; P.CancelB = 1 << GLKnxt.no; break; case 21: st += $" is not {(GLKorg.no+1)}"; P.CancelB = 1 << GLKorg.no; break; case 22: st += $" is not {(GLKorg.no+1)}"; P.CancelB = 1 << GLKorg.no; break; } } string st2 = __chainToStringGNLsub(SolLst, ref st3); st = st3 + st; Result = st; ResultLong = st + "\r" + st2; } return(st); }
public IEnumerable <GroupedLink> IEGet_SuperLink(GroupedLink GLKpre) { int SWCtrl = GLKpre.type; bool ALSpre = GLKpre is ALSLink; if (GLKpre.UGCellsB.Count == 1) { UCell U = GLKpre.UGCellsB[0]; List <UCellLink> Plst = CeLKMan.CeLK81[U.rc]; if (Plst != null) { foreach (var LK in Plst) { if (ALSpre && LK.type != W) { continue; } GroupedLink GLK = new GroupedLink(LK); if (Check_SuperLinkSequence(GLKpre, GLK)) { yield return(GLK); } } } } if (GNPXApp000.GMthdOption["GroupedCells"] == "1") { foreach (var GP in GLKMan.GrpCeLKLst) { if (ALSpre && GP.type != W) { continue; } if (!GLKpre.UGCellsB.EqualsRC(GP.UGCellsA)) { continue; } if (GLKpre.no2 != GP.no) { continue; } if (Check_SuperLinkSequence(GLKpre, GP)) { yield return(GP); } } } if (GNPXApp000.GMthdOption["ALS"] == "1" && ALSMan.AlsInnerLink != null) { if (GLKpre.type == W) { foreach (var GP in ALSMan.AlsInnerLink.Where(p => (p.ALSbase.Level == 1))) { if (GLKpre.no2 != GP.no) { continue; } if (GLKpre.UGCellsB.Equals(GP.UGCellsA)) { yield return(GP); } } } } if (ALSpre) { ALSLink ALK = GLKpre as ALSLink; int noB = 1 << ALK.no2; Bit81 BPnoB = new Bit81(pBDL, noB); Bit81 BP = BPnoB & ALK.UGCellsB.B81; // ALK.UGCellsB.ForEach(P=>{ if((P.FreeB&noB)>0) BP.BPSet(P.rc); }); Bit81 UsedCs = GLKpre.UsedCs; for (int tfx = 0; tfx < 27; tfx++) { Bit81 HS = BPnoB & pHouseCells[tfx]; if (!(BP - HS).IsZero()) { continue; } if ((HS - BP).IsZero()) { continue; } Bit81 NxtBP = HS - BP - UsedCs; if (NxtBP.IsZero()) { continue; } //C WriteLine("\n tfx:"+tfx ); //C WriteLine( " BP:"+BP ); //C WriteLine( " HS:"+HS ); //C WriteLine( "HS-BP:"+(HS-BP) ); //C WriteLine( "NxtBP:"+NxtBP ); List <UCell> NxtCs = NxtBP.ToList().ConvertAll(rc => pBDL[rc]); for (int k = 1; k < (1 << NxtCs.Count); k++) { UGrCells NxtGrpdCs = new UGrCells(tfx, ALK.no2); int kb = k; for (int n = 0; n < NxtCs.Count; n++) { if ((kb & 1) > 0) { NxtGrpdCs.Add(new UGrCells(NxtCs[n], ALK.no2)); } kb >>= 1; } GroupedLink GP = new GroupedLink(GLKpre.UGCellsB, NxtGrpdCs, tfx, W); //C WriteLine( GP ); yield return(GP); } } } yield break; }
private void _GroupedNL_SolResult(GroupedLink LK0, GroupedLink LKnxt, Stack <GroupedLink> SolStack, int SolType) { string st = ""; List <GroupedLink> SolLst = SolStack.ToList(); SolLst.Reverse(); SolLst.Add(LK0); foreach (var LK in SolLst) { bool bALK = LK is ALSLink; int type = (LK is ALSLink)? S: LK.type;//ALSLink, in ALS, is S foreach (var P1 in LK.UGCellsA.Select(p => pBDL[p.rc])) { int noB = (1 << LK.no); if (!bALK) { P1.SetCellBgColor(SolBkCr); } if (type == S) { P1.SetNoBColor(noB, AttCr); } else { P1.SetNoBColor(noB, AttCr3); } } if (type == W) { foreach (var P2 in LK.UGCellsB.Select(p => pBDL[p.rc])) { int noB2 = (1 << LK.no); if (!bALK) { P2.SetCellBgColor(SolBkCr); } P2.SetNoBColor(noB2, AttCr); } } } int cx = 2; foreach (var LK in SolLst) { ALSLink ALK = LK as ALSLink; if (ALK == null) { continue; } Color crG = _ColorsLst[cx++]; foreach (var P in ALK.ALSbase.B81.IEGet_rc().Select(rc => pBDL[rc])) { P.SetCellBgColor(crG); } } string st3 = ""; if (SolType == 1) { st = "Nice Loop(Cont.)"; //<>continuous } else //<>discontinuous { int rc = LK0.UGCellsA[0].rc; var P = pBDL[rc]; st = "Nice Loop(Discont.) r" + (rc / 9 + 1) + "c" + (rc % 9 + 1); int dcTyp = LK0.type * 10 + LKnxt.type; switch (dcTyp) { case 11: st += $" is {(LK0.no+1)}"; P.SetCellBgColor(SolBkCr2); break; case 12: st += $" is not {(LKnxt.no+1)}"; P.CancelB = 1 << LKnxt.no; break; case 21: st += $" is not {(LK0.no+1)}"; P.CancelB = 1 << LK0.no; break; case 22: st += $" is not {(LK0.no+1)}"; P.CancelB = 1 << LK0.no; break; } } string st2 = _ToGroupedRCSequenceString(SolStack, ref st3); st = st3 + st; Result = st; ResultLong = st + "\r" + st2; }