作者math120908 (小小郭)
看板b99902HW
標題[作業] 計程雙班HW6-2
時間Wed Nov 3 23:59:01 2010
是說這題其實還蠻難的= =...
所以就來提供一個簡單的思考方向啦...如果想要自己想的就請忽略這篇文章吧:p
------------------------------------------------------------------------------
首先釐清問題:
給你一個100*100的迷宮,迷宮裡五種格子:起點、終點、雞排、不可走、可走。
每個可走點都有一個0~9的數字。
雞排則是-10,但是只有第一次走的時候是-10,碰到第二次以後都是0。
現在你要從起點走到終點,希望路上經過的數字和盡量的小。
我們先把問題減化一下,假如現在沒有那個雞排...
那問題就變成: 給你一張地圖,你要從起點走到終點,求數字和最小。
那這個"無雞排問題"要怎麼做呢?
假設
dis(a,b)代表
從位置a到b所經過的數字和的最小值。
那無雞排問題就是要求dis(S,T)的值~~
那要怎麼求這個dis(S,T)呢@_@?
我們考慮的做法是一種
估價的方式。
先假設一開始
dis(S,S) = 0 跟 dis(S,所有除了S以外的格子)都是INF(無限大)
那你應該可以知道
dis(S,S上) dis(S,S下) dis(S,S左) dis(S,S右)
至少有一個是從S直接走過去最短~~
不過你還不知道是哪個最短,所以就全部走走看wwwww~~~
因此你可以先把
dis(S,S上) 改成dis(S,S) + map[ S上 ]
dis(S,S下) 改成dis(S,S) + map[ S下 ]
dis(S,S左) 改成dis(S,S) + map[ S左 ]
dis(S,S右) 改成dis(S,S) + map[ S右 ]
//是說我先假設都可以走啦= = 不能走就不要走就好了XDrz
如果這四個格子有任何一個的dis被改到是代表什麼意思呢?
假設被改到的點是P好了
那代表
"原本的dis(S,P)" > dis(S,S) + map[P]
也就是 原本從S到P的最小值不夠小Q_____Q!!!
因為從S走到S再走到P會更小!!!
所以可想而知~ dis(S,P的上下左右) 也有可能是錯的Orz...
沒關係我們學會教訓,繼續從P開始改就是了~~
因此,我們又可以想到XD,如果對所有的點P,存在一個相鄰的Q使得
dis(S,Q) > dis(S,P) + map[Q]
那我們就可以先把dis(S,Q)設成dis(S,P)+map[Q],然後繼續更新Q的上下左右。
如果有更新,就繼續做下去~~直到天荒地老...(?)
開玩笑的XD",直到全部點都不能更新他的四周了,這個時候就是傳說中的穩定狀態了!!
也就是S到所有點的最短路徑都求出來了!!!!
Wowwwwwww~ amazing................@_______@!
哦不過不要太高興,問題還沒結束,我們到目前只解決了"無雞排問題"
那"有雞排問題"呢@@!?
其實很簡單啦~~
因為從S到T的路徑 要馬是經過雞排 要馬是沒經過雞排
有經過雞排是dis(S,B) + dis(B,T) -10
沒經過就是dis(S,T)囉~~
所以只要
求一次dis(S,任意點)
跟一次dis(B,任意點) 就可以把上面的兩個值都求出來
最後再取最小值就好了:)~
哦寫這個要注意的是要注意的是map[S,B,T]的值不要亂設>.^
至於設什麼就自己想啦哇哈哈XDrz~~
至於這個做法你覺得會不會超過時間或者遞回過深呢~~
嘿嘿那其實不是現在要討論的問題XD 不過應該是不會啦~~至少我寫是過了= ="。
所以如果沒過大概就是沒看懂我寫的or寫爛了XDrz~~
//不然就是我這篇寫爛了(小聲)
---
先這樣吧...是說我寫得亂七八糟的不知道有沒有人看得懂= =|||
總之有問題再問吧(逃)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.236.141
※ 編輯: math120908 來自: 118.160.236.141 (11/03 23:59)
推 ianlini:從 如果這四個格子有任何一個的dis被改到是代表什麼意思呢 11/04 00:13
→ ianlini:這行....開始看不懂(倒 11/04 00:13
推 skyly:應該就字面上的意思吧 其中一個相鄰的格子被該格更新這樣 11/04 00:14
推 xluds24805:推~~我也是這樣子寫的丫...結果只有二分>口<"" 11/04 00:17
推 williamiced:大推 11/04 18:14