W-Wing

候補数字が2個のセルをbivalue cellといいます。 W-Wingは、同じ候補数字のbivalue cell1組とリンクで構成するパターン系Lockedの解析アルゴリズムです。 次の図で説明します。同じ候補数字(x、y)をもつ1組のbivalueセル(緑枠)が、 数字xの ①弱いリンク-②強いリンク-③弱いリンク と結びついているとします(左図)。 このとき、2つのbivalueセル(緑枠)と同時に関係をもつセル(オレンジ枠)が候補数字yをもつことはできません(右図)。
W-Wing


解析アルゴリズムは、次のとおりです。

  1. bivalueセルのリストを作成する。
  2. bivalueセルのリストから組合せにより2セル(P,Q)を選ぶ。
  3. P,Qは同じ候補数字をもち、異なるHouseに属することをチェックする
  4. 強いリンクLを1つ選ぶ。Lの両端セルは、P,Qと弱いリンクを形成することを確認する。
  5. Pの影響圏とQの影響圏の共通部分に除外候補があるかをチェックする。あればW-Wing

XY-Wingの例を示します。右の図場面には、この解を含め全部で9つのW-Wingがあります。

W-Wing   W-Wing

..973..81.8...9...7.5.84..33....82.74.2.......786..4.5...8.6..26........8.74.15.6
.4......512..7..8667..9.32......7..2..28.37..4..2......93.8..5771..5..638......9.

w-Wingの解析プログラム

W-Wingの解析プログラムです。上記のアルゴリズムを順にコード化してあります。
一点だけ補足します。[24,25]強いリンクの両端セルとP,Qが弱いリンク形成することは、 弱いリンクを検索するのではなく、ConnectedCells関数でチェックしています。

public partial class CellLinkGen: AnalyzerBaseV2{
    public bool  Wwing( ){
        if(BVCellLst==null)  BVCellLst = pBDL.FindAll(p=>(p.FreeBC==2)); //BV:bivalue
        if(BVCellLst.Count<2) return false;
        BVCellLst.Sort((A,B)=>(A.FreeB-B.FreeB));//重要

        CeLKMan.PrepareCellLink(1);    //strong Link生成

        bool Wwing=false;
        var  cmb = new Combination(BVCellLst.Count,2);
        int nxt=99;
        while(cmb.Successor(nxt)){
            UCell P=BVCellLst[cmb.Cmb[0]];
            UCell Q=BVCellLst[cmb.Cmb[1]];
            nxt=0;
            if( P.FreeB!=Q.FreeB ) continue;//(選んだ2セルは同じ数字)
            nxt=1;
            if( ConnectedCells[P.rc].IsHit(Q.rc) ) continue;

            foreach( var L in CeLKMan.IEGetCellInHouse(1) ){//1:strongリンク
                int no1B=(1<<L.no);
                if( (P.FreeB&no1B)==0 ) continue;
                if( L.rc1==P.rc || L.rc2==Q.rc ) continue;
                if( !ConnectedCells[P.rc].IsHit(L.rc1) )  continue;
                if( !ConnectedCells[Q.rc].IsHit(L.rc2) )  continue;
                int no2B=P.FreeB.BitReset(L.no);
                
                string msg2="";
                Bit81 Elm= ConnectedCells[P.rc] & ConnectedCells[Q.rc];
                foreach( var E in Elm.IEGetUCeNoB(pBDL,no2B) ){
                    E.CancelB=no2B; Wwing=true; //W-Wing fond
                    if(SolInfoDsp) msg2 += " "+E.rc.ToRCString();
                }

                if(Wwing){
                    SolCode=2;
                    if(SolInfoDsp){
                        UCell A=pBDL[L.rc1], B=pBDL[L.rc2];
                        int noBX=P.FreeB.DifSet(no2B);
                        P.SetNoBBgColor(noBX,AttCr,SolBkCr2);
                        Q.SetNoBBgColor(noBX,AttCr,SolBkCr2);
                    
                        A.SetNoBBgColor(no1B,AttCr,SolBkCr);
                        B.SetNoBBgColor(no1B,AttCr,SolBkCr);

                        string msg0= " bvCell: "+_XYwingResSub(P) +" ,"+_XYwingResSub(Q);
                        string msg1= "  SLink: "+A.rc.ToRCString() +"-"+B.rc.ToRCString()+"(#"+(L.no+1)+")";
                        Result = "W Wing Eli.;#"+(no2B.BitToNum()+1)+" in "+ msg2.ToString_SameHouseComp();
                        ResultLong = "W Wing\r"+msg0+"\r"+msg1
                                    + "\r Eliminated: #"+(no2B.BitToNum()+1)+" in "
                                    + msg2.ToString_SameHouseComp();
                    }
                    if( !AnMan.SnapSaveGP(true) )  return true;
                    Wwing=false;
                }
            }
        }
        return false;
    }
}

Top