« 点数計算ひとまず完了 | トップページ | 向聴数チェックアルゴリズムその2作成中 »

2004/11/12

向聴数チェックアルゴリズムその1作成

先日のパターン1で向聴数チェックプログラムを作成。

動作させてみたが。うーんやっぱり遅い。3向聴の全パターンをチェックするのに1分近くかかる。まあ、すべての牌を追加して毎回上がり形判定を繰り返しているのだから聴向数が1増えるたびに34倍遅くなる。このままでは、このアルゴリズムは2向聴程度からしかつかえないだろう。
なにか無駄な処理を省けるといいのだが。

/*
 *向聴数チェック アルゴリズム1
 *
 */
void ShantenCheck(void)
{
    TPai paiVector[34] = { 1, 2, 3, 4, 5, 6, 7, 8, 9,   //1萬~9萬
                          11,12,13,14,15,16,17,18,19,   //1ピン~9ピン
                          21,22,23,24,25,26,27,28,29,   //1ソウ~9ソウ
                          31,33,35,37,41,43,45};        //字牌
    char *shantenStr[] = {
        "聴牌",
        "一向聴",
        "二向聴",
        "三向聴",
    };
    vector<TTehai> agariList;
    int i,j;
    int crrShanten, result = 100;
    AnsiString msg;
    TTehai tehai2;
    int pai;
    getAgariStyle(*tehai, &agariList);

    if ( agariList.size() > 0 ){
        debug("あがっている");
        goto Exit;
    }
    // 牌(34種類)を最大4枚まで追加して上がり形になるか調べる
    for ( i = 0; i < 34 * 34 * 34 * 34; i++ ){
        agariList.clear();
        tehai2 = *tehai;
        for ( j = i, crrShanten = 0; j > 0; j = j / 34, crrShanten++ ){
            pai = paiVector[j % 34];
            if ( (tehai2.paiArray[pai-1]
                  + tehai2.paiArray[pai]
                  + tehai2.paiArray[pai+1]) == 0 ){
                //孤立している牌は計算しない
                goto LoopEnd;
            }
            tehai2.addPai(pai);
        }
        getAgariStyle(tehai2, &agariList);
        if ( agariList.size() > 0 ){
            if (crrShanten < result ){
                debug(shantenStr[crrShanten-1]);
                result = crrShanten;
            }
        }
LoopEnd:
    }
Exit:
    debug("終了");
    return;
}

shanten

総ステップ数:3165

|

« 点数計算ひとまず完了 | トップページ | 向聴数チェックアルゴリズムその2作成中 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/61182/1944548

この記事へのトラックバック一覧です: 向聴数チェックアルゴリズムその1作成:

« 点数計算ひとまず完了 | トップページ | 向聴数チェックアルゴリズムその2作成中 »