午後のひとときに、数え上げ問題を解いてみよう。
問題
n×nの領域の格子点に釘を打つ。
3つの釘に輪ゴムを掛けて、三角形を作るとする。
数学問題
3×3、4×4、5×5のそれぞれの領域において、三角形は何通り作れるでしょうか。
プログラミング問題
n×nの領域において、三角形は何通り作れるでしょうか。
nは1以上で出来るだけ大きなnについてまで求められる高速なプログラムを考えよ。
シンキングタ~イム
まずは数学編です。
このような数え上げ問題、
重要なのは、漏れなく、ダブリなく、出来る限り簡単に数えること。
3×3と言わず、2×2から考えていきましょう。
格子点を、
0 1
2 3
としましょうか。
三角形は、
012
013
023
123
の4通り作れます。
同様に
0 1 2
3 4 5
6 7 8
として、三角形は、
013 014 015 016 017 018
023 024 025 026 027 028
034 035 037 038
045 046 047
056 057 058
067 068
078
123 124 125 126 127 128
134 135 136 137 138
145 146 148
156 157 158
167 168
178
234 235 236 237 238
245 247 248
256 257
267 268
278
346 347 348
356 367 358
367 368
378
456 457 458
467 468
478
567 568
578
の76通りでした。
ただ、このような数え方では、そろそろ限界かと思います。
三角形に出来ないケースを考えると、3点が一直線上に並んだ場合ということが解ります。
つまり、全事象から余事象を取り除くほうが楽ではなかろうかということです。
全事象は、3×3の9点から、異なる3点を選ぶので、
(3^2)C3=9C3=(9・8・7)/(3・2・1)=84
で84通り。
余事象は、3点が一直線上に並んだ場合なので、
012
345
678
036
147
258
048
246
の8通り。
84-8=76
76通り。
こちらのほうが先の方法よりも楽に求まりましたね。
4×4は、
0 1 2 3
4 5 6 7
8 9 A B
C D E F
全事象は、
(4^2)C3=16C3=(16・15・14)/(3・2・1)=560
で560通り。
余事象は、
→方向を+x、←方向を-x、↓方向を+yとして、傾きで考える。
xの取りうる値は、-1、0、1
yの取りうる値は、0、1
組み合わせは、3×2=6あるが、2点目は1点目より後ろ、3点目は2点目より後ろとすると、
(x, y)={ (-1, 1), (0, 1), (1, 0), (1, 1) }
の4通りを考えれば良い。
(x, y)=(-1, 1)の場合、
258 369 36C 39C 69C 7AD
の6通り。
(x, y)=(1, 1)の場合、
同様に6通り。
(x, y)=(0, 1)の場合、
048 04C 08C 159 15D 19D 26A 26E 2AE 37B 37F 3BF 48C 59D 6AE 7BF
の16通り。
(x, y)=(1, 0)の場合、
同様に16通り。
と余事象は44通り。
560-44=516
516通り。
5×5は、
0 1 2 3 4
5 6 7 8 9
A B C D E
F G H I J
K L M N O
全事象は、
(5^2)C3=25C3=(25・24・23)/(3・2・1)=2300
余事象は、
(x, y)={ (-2, 1), (-1, 1), (-1, 2), (0, 1), (1, 0), (1, 1), (1, 2), (2, 1) }
の8通りを考えれば良く、
(x, y)=(-2, 1)の場合、
47A 9CF EHK
の3通り。
(x, y)=(-1, 2)の場合、
(x, y)=(1, 2)の場合、
(x, y)=(2, 1)の場合、
同様に3通り。
(x, y)=(-1, 1)の場合、
26A 37B 37F 3BF 48C 48G 48K 4CG 4CK 4GK 7BF 8CG 8CK 8GK 9DH 9DL 9HL CGK DHL EIM
の20通り。
(x, y)=(1, 1)の場合、
同様に20通り。
(x, y)=(0, 1)の場合、
1列目は、
05A 05F 05K 0AF 0AK 0FK 5AF 5AK 5FK AFK
で5倍して、
の50通り。
(x, y)=(1, 0)の場合、
同様に50通り。
余事象は、112通り。
2300-152=2148
2148通り。
3×3は76通り
4×4は516通り
5×5は2148通り
と、数え上げはどんどん面倒になっていく。
漸化式でもあれば良いのだろうが、なかなか難しいようです。
というわけで、手計算でやるのは面倒なので、プログラミングの出番ですね。
明日はプログラミング編ですね。
ではでは
knifeのmy Pick