Mr.Tです、こんにちは。
前回のアルゴリズムの続きです。前回1~45まで、流れを作りましたね。
実は、すでに答えがわかっているので、プログラムに落とし込むのは、1~45までの順番に書いていけば
答えはでます。
VB.NET コンソールアプリで、書いていくとこんな感じです。
Option Explicit On
Option Strict On
Module Module1
'1.今から登ります。
Sub Main()
Dim 日にち As Integer
Dim 合計距離 As Integer
Dim 登った距離 As Integer
'2.まだ、0mです。
登った距離 = 0
'3.1日目。
日にち = 1
'4.昼間3m登る。今は、3mの場所にいます。
登った距離 = 3
'5.まだ、10mを超えてません
If 登った距離 < 10 Then
'6.夜2m落ちる。
登った距離 = 3 - 2
'7.合計1m。
合計距離 = 1
'8.2日目。
日にち = 2
'9.昼間3メートル登る。今は、4mの場所にいます。
登った距離 = 1 + 3
'10.まだ、10mを超えてません。
If 登った距離 < 10 Then
'11.夜2m落ちる。
登った距離 = 4 - 2
'12.合計2m。
合計距離 = 2
'....こういう処理がずっと続きます
End If
End If
End Sub
End Module
さて、今回の一番重要な、アルゴリズムという視点からどこが重要なのかというと、「5.まだ10mを超えていません」のような部分です。
if 登った距離<10 then
(....処理)
end if
5番では、登った距離が10mでなければ、6番以降の計算を全部含まなくてはいけない。
10番では、登った距離が10mでなければ、11番以降の計算を全部含まなくてはいけない。
15番では、登った距離が10mでなければ、16番以降の計算を全部含まなくてはいけない。
20番では、登った距離が10mでなければ、21番以降の計算を全部含まなくてはいけない。
....
図にすると、こんな感じです。
※へたくそなのは、ゆるしてね。一応、全部円と考えてみてください。
これが、今回のアルゴリズムです。
こうやって、丸の中に丸がすっぽりと入りこむ場合で、それが何度も何度も出てくる場合には、
「ループ処理」がぴったり合います。
ループ処理はその書き方が色々ありますが、丸が中にはいるようになるのは、10メートルを超えたのか?という
ことを何度も比較できるものがよさそうです。
で、ループの中で、何度も何度も計算を繰り返すわけですから、似たような計算をしているところがないか
考えて見ます。
| 3番 | 8番 | 13番 | 18番 | 23番 | 28番 | 33番 | 38番 | 43番 |
| 4番 | 9番 | 14番 | 19番 | 24番 | 29番 | 34番 | 39番 | 44番 |
| 5番 | 10番 | 15番 | 20番 | 25番 | 30番 | 35番 | 40番 | |
| 6番 | 11番 | 16番 | 20番 | 26番 | 31番 | 36番 | 41番 | |
行単位でみると、3,8,13...の番号は、日にちを数える計算ですね。
4、9、14...は、昼間3メートル登る計算をして、昼間に登った距離を求める計算ですね。
このように規則性があることをわかってください。
では、実際にループを描いてみます。
While (登った距離 <=
10)
(ループの中)
End While これが、ループ処理ですね。登った距離が10m未満だったら、ぐるぐる回ってループの中で毎回同じことをします。
では、そのループの中で何をするんでしょう?
まずは、1番から順に見ていきましょう。
1番は、「これから登ります」ですね。これをループの中にいれると、登った距離が10m未満の場合、毎回「これから登ります」
となります。おかしいですね。1番の「これから登ります」は1回しか出てきません。
なので、これはループの外です。
2番は、「まだ、0mです」です。これは、なぜ0mなんでしょう?まだ登ってないからですね。つまり、登った距離が10m未満だからです。
これは、ループの条件にある「登った距離<10」で判断するのと一緒ですね。
つまり、2番は、5番、10番、15番、...と一緒の処理なわけです。
3番は、日にちの計算ですが、同じような処理が、8番、13番、...と続きます。
それも、1日、2日、3日と、一日ずつ増えていきます。これは、ループ処理ですね。
では、
While (登った距離 <= 10)
日にち = 日にち +
1 (ループの中)
End While
これで、日にちが一日ずつ変わっていくことになります。
では、次。登った距離を考えます。日にちの計算と一緒で、3mが昼間登れる距離なので、
登った距離 = 登った距離 + 3
ですね。
次回に、続きます。