72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package soko
|
|
|
|
type stateCost struct {
|
|
state *State
|
|
cost int
|
|
distances Ints
|
|
}
|
|
|
|
type stateCostQueue struct {
|
|
first *stateCostQueueItem
|
|
}
|
|
|
|
type stateCostQueueItem struct {
|
|
Value *stateCost
|
|
Next *stateCostQueueItem
|
|
}
|
|
|
|
func (q *stateCostQueue) Empty() bool {
|
|
return q.first == nil
|
|
}
|
|
|
|
func (q *stateCostQueue) Get() *stateCost {
|
|
if q.Empty() {
|
|
panic("nothing in queue")
|
|
}
|
|
first := q.first
|
|
q.first = first.Next
|
|
return first.Value
|
|
}
|
|
|
|
func (q *stateCostQueue) Put(value *stateCost) {
|
|
priority := value.cost
|
|
item := &stateCostQueueItem{value, nil}
|
|
if q.Empty() {
|
|
q.first = item
|
|
return
|
|
}
|
|
if priority < q.first.Value.cost {
|
|
item.Next = q.first
|
|
q.first = item
|
|
return
|
|
}
|
|
curr := q.first
|
|
for curr.Next != nil {
|
|
if priority < curr.Next.Value.cost {
|
|
item.Next = curr.Next
|
|
curr.Next = item
|
|
return
|
|
}
|
|
curr = curr.Next
|
|
}
|
|
curr.Next = item
|
|
}
|
|
|
|
func (q *stateCostQueue) Update(value *stateCost) {
|
|
var prev *stateCostQueueItem
|
|
curr := q.first
|
|
for curr.Value != value {
|
|
prev = curr
|
|
curr = curr.Next
|
|
if curr == nil {
|
|
panic("not in queue")
|
|
}
|
|
}
|
|
if prev == nil {
|
|
q.first = curr.Next
|
|
} else {
|
|
prev.Next = curr.Next
|
|
}
|
|
q.Put(value)
|
|
}
|