裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

パターゴルフのコース設計

2016年09月13日 | ブログラミング

締め切りが 2016/09/13 10:00 AM なので,その 1 分後に登録されるように予約

パターゴルフのコースを新しく作ることにしました。
そこで、各ホールの標準打数を考えています。

m ホールで合計の標準打数が n になるように、各ホールの標準打数を決めなければなりません。
なお、各ホールの標準打数は1以上5以下とし、m≦18とします。

例えば、3ホールで合計が12の場合、以下の10通りがあります。
2 5 5
3 4 5
3 5 4
4 3 5
4 4 4
4 5 3
5 2 5
5 3 4
5 4 3
5 5 2

標準入力から m と n がスペースで区切って入力されます。
このとき、各ホールの標準打数のパターン数を標準出力に出力してください。

【入出力サンプル】
標準入力
3 12

標準出力
10

==========

m, n が小さいときの解を網羅して,規則性を見いだす。
規則に従い,以下のような行列(18×90 の行列)を生成する。

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
[1,]    1    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[2,]    0    1    2    3    4    5    4    3    2     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[3,]    0    0    1    3    6   10   15   18   19    18    15    10     6     3     1     0     0     0     0     0     0     0     0     0     0
[4,]    0    0    0    1    4   10   20   35   52    68    80    85    80    68    52    35    20    10     4     1     0     0     0     0     0
[5,]    0    0    0    0    1    5   15   35   70   121   185   255   320   365   381   365   320   255   185   121    70    35    15     5     1
  :
  :

その行列の m 行,n 列の数値が解である。

f = function(m, n) {
    a = matrix(0, 18, 90)
    a[1, 1] = 1
    x = rep(1, 5)
    for (i in 2:18) {
        k = i+0:(length(x)-1)
        for (j in 0:4) {
            a[i, j+k] = a[i, j+k] + x
        }
        x = a[i, i:(i*5)]
    }
    cat(a[m, n])
}

> f(3, 12)
[1] 10
> f(5, 21)
[1] 70
> f(9, 35)
[1] 32211
> f(13, 60)
[1] 6175
> f(18, 72)
[1] 2546441085

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« カードを使って数を作ろう(... | トップ | 何回いえばわかるんだ(^_^) »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事