(Finned) Franken/Mutant Fish

Fishは、行と列(または列と行)の2つのhouse群のLockedに基づくアルゴリズムです。Lockedにより除外できるセル・候補数字を、BaseSetとCoverSetという概念で解説しました。
ここでN次Fishの定義を再度示します。

【N次Fish】
数字Xに着目する。N個以下のXを含むhouseをN個選んだとき(BaseSet)、これとは別のN個のHouse(CoverSet)がBaseSetを完全に含むなら、BaseSetはLocked(限定状態)にある。 Lockedを壊す位置にある候補数字は除外できる。


FishのBaseSet/CoverSetは行/列(または列/行)でしたが、BaseSetとCoverSetには"行","列"の条件はありません。 "行と列の組合せ"でも条件を満たします。BaseSetとCoverSetは"ブロック"でも、あるいは"行・列・ブロック"が混在しても条件に合います。ただし、BaseSetを構成するHouse群に重なりはなく、CoverSetも同様に重なりがないとします(重なりのあるケースは、後に触れます)。これらの"行・列・ブロック"が混在するFishには名前がついています。 BseSet/CoverBseにブロックが少なくとも1個加わったタイプは、Franken Fishと呼びます。また、"行・列・ブロックが混在する"タイプは、Mutant Fishの名前がついています。解析アルゴリズムには差がないのでFranken/Mutant Fishと呼ぶことにします。

Franken/Mutant FishにもFin付タイプがあります。"BaseSetに含まれCoverSetに含まれないセル・候補数字をFin"と定義します。 CoverSetに含まれBaseSetに含まれないセル・候補数字があり、これが真のとき同時にFinを除外できれば、Finned Franken/Mutant Fishが成立します。

以上をまとめ、解析アルゴリズムに整理します。

  1. 着目数字Xの設定
  2. BaseSetの選択
    行・列・ブロックの27個のHouseからN個選択し、BaseSetとする。このとき、N個のHouseに重なりはないとする。 BaseSetに含まれるセル群をBとします。
  3. CoverSetの選択
    行・列・ブロックの27個のHouseからBaseSetとは異なるN個を選択し、CoverSetとする。 このとき、N個のHouseに重なりはないとする。CoverSetに含まれるセル群をCとします。
  4. CoverSetがBaseSetを完全に含むとき(Finなし)
    完全に含まれることは、集合で表すと Fin = B-C=空集合 です。 E = C-B ≠ 空集合のとき、Eの要素eから着目数字Xが除外できます。(差集合:A-B=A∩(notB)
  5. Fin付きのとき
    Fin付きは集合で表すと Fin = B-C ≠ 空集合 です。 E = C-B≠ 空集合 のとき、Eの要素セルeがFin 全体(Finが複数セルのときもある)を影響圏に含むなら、eから着目数字Xが除外できます。
(Finned) Franken/Mutant Fishの例 を示します。

Franken SwordFish

Franken SwordFish
digit : #8
BaseSet : r1 c38
CoverSet : r9 b13


Finned Franken SwordFish
Finned Franken SwordFish
digit : #4
BaseSet : r48 c1
CoverSet : r6 c4 b7
Fin : r4c9 r8c8

..4672....5...34...1.5...2798..4..15.31...27.76..2..4354...9.3...92...6....4567..
.4...1.286..5....7..7.46...7.3..98..9.......2..12..3.9...95.1..1....2..559.1...7.

次は、高次数の Finned Franken/Mutant Fish の例です。なお、これらにはもっと簡単な解法があります。
Finned Mutant Squirmbag

Finned Mutant Squirmbag
Digit: #2
BaseSet: r125 c2 b8
CoverSet: r48 c79 b2
FinSet: r5c4 r7c6


Finned Mutant Leviathan

Finned Mutant Leviathan
Digit: #7
BaseSet: r8 c156 b346
CoverSet: r456 c9 b127
FinSet: r2c78


次の81桁の数字列を GNPXのグリッドにペーストし、/Solve/MultiSolve/ で解く。
数独パズルのフォーマットは、おおよその形式に対応しているので、他の問題/フォーマットでも試みると良いでしょう。
( Paste the next 81 digits onto the GNPX/grid and solve with /Solve/MultiSolve/ )
.38.6...96....93..2..43...1..61..9355.3.8.1...4........8.65..13...8..5.63.59..827
..9..154..5..9.....6.5..92.8..3..1.41..4.6..95.4..8..2.42..9.6.....6..1..187..2..

(Finned) Franken/Mutant Fishの解析プログラム

(Finned) Franken/Mutant Fishの解析プログラムは、上記のアルゴリズムをそのままコードにすればできます。 しかし、BaseSet/CoverSetを用いる汎用Fishサブプログラム(ExtFishSub)があるので、これのパラメータ制御だけで(Finned) Franken/Mutant Fishは解けます。

public partial class FishGen: AnalyzerBaseV2{
//Frankenn/MutantFish
    private int rcbSel=0x7FFFFFF;
    public bool FrankenMutantFish( ){
        for( int sz=2; sz<=4; sz++ ){   //対称性からサイズ4まで
            for( int no=0; no<9; no++ ){
                if( ExtFishSub(sz,no,27,rcbSel,rcbSel,false) ) return true;
                if( AnMan.CheckTimeOut() ) return false;
            }
        }
        return false;
    }
//FinnedFrankenn/MutantFish
    public bool FinnedFrankenMutantFish( ){
        for( int sz=2; sz<=7; sz++ ){   //Finあり はサイズ7まで(5:Squirmbag 6:Whale 7:Leviathan)
            for( int no=0; no<9; no++ ){
                if( ExtFishSub(sz,no,27,rcbSel,rcbSel,true) ) return true;
                if( AnMan.CheckTimeOut() ) return false;
            }
        }
        return false;
    }
}


Top