Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  3733  : トラックバック  52

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板

書庫

日記カテゴリ

Mr.Tです、こんにちは。

アルゴリズムは、プログラム(マ)になくてはならないのに、プログラマ初心者にとっては、なかなかアルゴリズム自体を
学ぶ機会は少ないです。

アルゴリズムを勉強するのに、実はコンピュータなんかいらないと考えています。
紙と鉛筆さえあれば、学べます。

問題:

毛虫が10メートルの深さの土管の底に落ちました。なんとか、頑張って毛虫は、地上に出たい。
しかし、毛虫は昼間頑張って3メートル上っても、夜になって寝てしまうと2メートルずり落ちます。

毛虫は、何日目に地上に出ることができるでしょう?

ただし、10メートルちょうどでは、地上に出たことにはなりません。
移動速度は一定で、地上にたどりつくまで変化はありません。天候や、環境には、移動には無関係です。
土管を登る際に、障害物はなく、まっすぐ10メートルです。
一日の区切りは、朝の6時から夕方の6時までが昼とし、翌日6時までが夜です。
毛虫が落ちたのは朝6時ちょうどで、そこから日にちを1日と数えるとします。

解き方:

これは、最大最小問題の変形です。
最大値を求めるというアルゴリズムは、比較をどうやって行うか、がミソです。

まずは、何をもとめるのかを見極めます。
ここでは、「何日後に毛虫が地上に出れるか?」が求めるものです。

まずは、問題を整理しましょう。
1)条件を抜き出します。
  ここで抜き出すときには、必要な条件なのか、必要じゃないのかは、考えません。

 ・土管はまっすぐ10メートルの深さ

 ・昼間3メートル登る

 ・夜2メートル落ちる

 ・移動速度は一定

 ・6時~18時が昼

  ・18時~翌6時が夜

 ・落ちた日を1日と数える

 

2)地上にでた、ということはどういうことなのか?

 10メートルちょうど、では地上に出てません。
 逆に言えば、10メートル1センチでも地上にでたことになります。
 日本語を使えば、「10メートルを超えること」です。
 この意味の変換に慣れることが、重要です。

 ということは、「毛虫の移動距離が10メートルを超えたら地上にでたことになるので、そのときは何日目か?」
 を求める、という問題になります。

3)10メートルを超えるってどういうことだ?

 ようやくここで、数字を使います。メートルは邪魔なので、省略しますね。
  超えるってのは、数字を使うと、不等号の<や>のようにイコールがないものですね。

   10 <10.0001  , 10<11

 例えば、上のようなときです。 考える時は、適当な数字やサンプルで考えましょう。
 

4)じゃあ、毛虫は、どのくらい進むんだっけ?

 条件を見直しましょう。昼に3メートル進みますが、夜に2メートル戻ってしまいます。
 じゃあ、実際に一日ごとに、その動きを追ってみましょう。(ステップで追うということです)

日にち 全体的な移動距離
1m
2m
3m
4m
5m
6m
7m
8m
9m

はい、これで「なーんだ11日じゃないかぁ」と思った人。
間違いですから。

 

いいですか?求めるのは、

「毛虫の移動距離が10メートルを超えたら地上にでたことになるので、そのときは何日目か?」

です。求めるゴールは、何度も見直してチェックするんです。

つまり、地上にでるのは常に、昼で動いているときです。10メートルかどうかをチェックするのは
一日でどんだけ動いたか、じゃないんです。

一日目は1mしか進みません。次の日、毛虫の開始場所は、1mからです。
そこから、3m登ります。
で、夜に2m落ちます。
で、2日目は1メートルからの出発で、3メートル登りますから、昼のおしまいには
4メートルの場所にいることになります。

これを踏まえて、表に列を二つ追加します。

日にち 昼間の総合移動距離 夜の落ちる距離 その日の移動距離
3m 2m 1m
4m 2m 2m
5m 2m 3m
6m 2m 4m
7m 2m 5m
8m 2m 6m
9m 2m 7m
10m 2m 8m
11m 2m 9m

 

はい、コレで答えがわかりましたね。9日です。

これを文字で、その動きを追っていくようにします。

  1. 今から登ります。
  2. まだ、0mです。
  3. 1日目。
  4. 昼間3m登る。今は、3mの場所にいます。
  5. まだ、10mを超えてません
  6. 夜2m落ちる。
  7. 合計1m。
  8. 2日目。
  9. 昼間3メートル登る。今は、4mの場所にいます。
  10. まだ、10mを超えてません。
  11. 夜2m落ちる。
  12. 合計2m。
  13. 3日目。 
  14. 昼間3m登る。今は、5mの場所にいます。
  15. まだ、10mを超えてません。
  16. 夜2m落ちる。
  17. 合計3m。
  18. 4日目。 
  19. 昼間3m登る。今は、6mの場所にいます。
  20. まだ、10mを超えてません。
  21. 夜2m落ちる。
  22. 合計4m。
  23. 5日目。 
  24. 昼間3m登る。今は、7mの場所にいます。
  25. まだ、10mを超えてません。
  26. 夜2m落ちる。
  27. 合計5m。
  28. 6日目。 
  29. 昼間3m登る。今は、8mの場所にいます。
  30. まだ、10mを超えてません。
  31. 夜2m落ちる。
  32. 合計6m。
  33. 7日目。 
  34. 昼間3m登る。今は、9mの場所にいます。
  35. まだ、10mを超えてません。
  36. 夜2m落ちる。
  37. 合計7m。
  38. 8日目。 
  39. 昼間3m登る。今は、10mの場所にいます。
  40. まだ、10mを超えてません。
  41. 夜2m落ちる。
  42. 合計8m。
  43. 9日目。
  44. 昼間3m登る。今は、11mの場所にいます。
  45. 10メートルを超えました。

 これで、ようやく毛虫が地上にでていることがわかります。
 長くなったので、次回に続きます。

投稿日時 : 2007年11月10日 2:52

コメント

# re: アルゴリズムについて 2007/11/10 11:53 凪瀬
アルゴリズムを理解できるかどうかは割り算の筆算を説明できるかどうかで判断しています。
やり方を忘れている人は…どうしてくれましょうw

# re: アルゴリズムについて 2007/11/10 15:17 中博俊
5)60
  12

これ?

# re: アルゴリズムについて 2007/11/10 19:50 Mr.T
割り算の筆算って、小学生とかにならう、あの書き方でってことですか?


# 続 アルゴリズム 2007/11/11 2:50 Mr.Tの場所
続 アルゴリズム

# re: アルゴリズムについて 2007/11/12 0:27 凪瀬
そそ。
小学校でのアレです。
別にそろばんでの掛け算の仕方でも、連立方程式のとき方でもいいんだけど、
割り算の筆算が一番しっくり来る気がする。
掛け算や足し算の筆算でもいいんだけど、一桁ずつ計算している感が出にくいのが難点ですかね。

Post Feedback

タイトル
名前
Url:
コメント