階段で立ち話

awkネタ

ある階段を下からAさんが上がっていくと同時に、上からBさんが降りてきます。
階段は1段ずつ上がる(降りる)必要はなく、最大で3段まで飛ばして進む(一気に
4段進む)ことが出来ます。
ただし、何段飛ばすときも、1回の移動にかかる時間は同じとします。2人が同時
に1回ずつ移動する時、「2人が同じ段に止まるような動き方」が何通りあるかを
考えます。(階段は十分な幅があり、すれ違うことが出来ますので、ぶつかること
はありません。また、同じ段に止まった時点で移動は終了するものとします)
例えば、4段の階段があったとき、次の4通りがあります
  A B 移動方法
(1) 0→1→2 4→3→2 A,Bともに1段ずつ移動
(2) 0→1 4→1 Aは1段移動、Bは2段飛ばして移動
(3) 0→2 4→2 A,Bともに1段飛ばして移動
(4) 0→3 4→3 Aは2段飛ばして移動、Bは1段移動
10段の階段で同じように移動したとき、2人が同じ段に止まるのは何通りあるかを
求めてください

AがBよりも上の段に達した場合は探索を止めます。

#!/usr/bin/awk -f

BEGIN{
    N = 10;         # 階段の段数
    STEPS = 4;      # 一気に進める段数

    # Aさんは0の位置から、BさんはNの位置からスタート
    print move(0, N);
}


function move(a, b,cnt,da,db){
    if(a > b){      # AさんがBさんよりも上になれば
        return 0;   # 終了
    }
    if(a == b){     # 同じ段に止まれば
        return 1;   # カウント
    }
    cnt = 0;
    for(da = 1; da <= STEPS; da++){
        for(db = 1; db <= STEPS; db++){
            cnt += move(a + da, b - db);
        }
    }
    return cnt;
}

今回も再帰処理です。
仮引数にcnt,da,dbを入れるのを忘れないでください。
実行してみます。

awk -f q15.awk 
201

沢山ありますね。