Недялко обнови решението на 23.01.2014 14:32 (преди над 4 години)
+package main
+
+// A pretty stupid solution, can't think of anything better...
+
+import (
+ "sync"
+)
+
+func moves(pos [2]int) [][2]int {
+ return [][2]int{
+ {(3 + pos[0]) % 4, (3 + pos[1]) % 4},
+ {(5 + pos[0]) % 4, (5 + pos[1]) % 4},
+ {(5 + pos[0]) % 4, (3 + pos[1]) % 4},
+ {(3 + pos[0]) % 4, (5 + pos[1]) % 4},
+ }
+}
+
+func playMall(mall [4][4]rune) [][2][2]int {
+ var wg sync.WaitGroup
+ var mallMutex, resultMutex sync.Mutex // This is shitty, there has to be a better way than locking the whole mall...
+
+ successPos := [2]int{-1, -1}
+ stuckPos := [2]int{-2, -2}
+
+ result := make([][2][2]int, 0, 100)
+
+ shopper := func(myrow, mycol int) {
+ defer wg.Done()
+ myPos := [2]int{myrow, mycol}
+ var newPos [2]int
+
+ for i := 0; i < 100; i++ {
+ mallMutex.Lock()
+ myMoves := moves(myPos)
+ newPos = stuckPos
+
+ for _, move := range myMoves {
+ if mall[move[0]][move[1]] != 'X' {
+ newPos = move
+ break
+ }
+ }
+
+ if newPos != stuckPos {
+ mall[newPos[0]][newPos[1]] = 'X'
+ mall[myPos[0]][myPos[1]] = '-'
+ }
+
+ resultMutex.Lock()
+ mallMutex.Unlock()
+
+ result = append(result, [2][2]int{myPos, newPos})
+ myPos = newPos
+ resultMutex.Unlock()
+
+ if myPos == stuckPos {
+ break
+ }
+
+ //time.Sleep(10 * time.Millisecond)
+ }
+
+ if myPos != stuckPos {
+ resultMutex.Lock()
+ result = append(result, [2][2]int{myPos, successPos})
+ resultMutex.Unlock()
+ }
+
+ }
+
+ for row := range mall {
+ for col, val := range mall[row] {
+ if val == 'X' {
+ wg.Add(1)
+ go shopper(row, col)
+ }
+ }
+ }
+
+ wg.Wait()
+
+ return result
+}