最短経路探索問題

スタートからの距離がdであることが決定している点集合P(d) = [p1, p2, ... , pn]に隣接し、かつ距離が決定していない点集合をP(d+1)として決定する…というのを再帰的にやると、距離のマップが出るよね。このとき、壁は初期状態から距離∞(無限大)を持つとする。

で、経路は、ゴールから逆に、決定した距離が-1になる隣接点を辿れば、大丈夫なんかな。

アルゴリズムをググったら負けだと思っている。

コードは汚い。whileは負けだていうか再帰じゃないし。テストコードもない。あげくの果てにスタートまで塗りつぶしているがもう終わり。

多分…3時間は超えたなぁ。

Point = Origin mimic

Point Start = Point mimic
Point Start start? = true
Point Start dist = 0

Point Wall = Point mimic
Point Wall dist = Number ∞

Point Goal = Point mimic
Point Goal goal? = true

Point dist = nil
Point start? = false
Point goal? = false

Point asText = " "
Point Start asText = "S"
Point Goal asText = "G"
Point Wall asText = "*"

Point parse = method(c,
  if(c == "S", Point Start mimic,
    if(c == "G", Point Goal mimic,
      if(c == "*", Point Wall mimic, Point mimic)
    )
  )
)
"Point Object is loaded..." println

m = FileSystem readLines("input.txt") map(chars map(c, Point parse(c)))
"m is loaded..." println

m each(x, line, line each(y, p, p x = x. p y = y))
m neighborOf = method(p, set([p x - 1][p y], [p x + 1][p y], [p x][p y - 1], [p x][p y + 1]))
m goal = m flatten find(goal?)
"m goal is #{m goal cellSummary}" println

d = 0
while(m goal dist == nil,
  "dist #{d} to #{d+1}" println
  m flatten select(dist == d) each(p, m neighborOf(p) select(dist == nil) each(dist = d + 1))
  d = d + 1
)
"dist map is created..." println

findRoad = method(p, m neighborOf(p) find(dist == p dist - 1))
q = m goal
while(q start? ==false,
  q = findRoad(q)
  q asText = "$"
)

m each(map(asText) join println)
Point Object is loaded...
m is loaded...
m goal is  Point Goal_0xF30494:
  x                            = 8
  y                            = 22

dist 0 to 1
dist 1 to 2
dist 2 to 3
(中略)
dist 58 to 59
dist 59 to 60
dist map is created...
**************************
*$* * $$$                *
*$* *$$*$ *************  *
*$* $$* $  ************  *
*$$$$*  $$$$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$$ * $$$$$$$$$$$$$G  *
*  * $$$$$*********** *  *
*    *        ******* *  *
*       *                *
**************************