Александър обнови решението на 19.01.2014 17:54 (преди над 4 години)
+package main
+
+var directions [4][2]int = [4][2]int{{-1, -1}, {1, 1}, {-1, 1}, {1, -1}}
+
+type person struct {
+ movesCount int
+ position [2]int
+ Finished bool
+}
+
+func newPerson(x int, y int) *person {
+ var p *person = new(person)
+ p.position[0] = x
+ p.position[1] = y
+ return p
+}
+
+func (p *person) move(mall *[4][4]rune) [2][2]int {
+ var result [2][2]int
+ result[0][0] = p.position[0]
+ result[0][1] = p.position[1]
+
+ if p.movesCount != 100 {
+ var x, y int
+ moved := false
+
+ for i := 0; i < 4; i++ {
+ x = (p.position[0] + directions[i][0] + 4) % 4
+ y = (p.position[1] + directions[i][1] + 4) % 4
+
+ if mall[x][y] == '-' {
+ mall[x][y] = 'X'
+ mall[p.position[0]][p.position[1]] = '-'
+
+ result[1][0] = x
+ result[1][1] = y
+ p.position[0] = x
+ p.position[1] = y
+
+ p.movesCount++
+ moved = true
+ break
+ }
+ }
+
+ if !moved {
+ result[1][0] = -2
+ result[1][1] = -2
+ p.Finished = true
+ }
+ } else {
+ result[1][0] = -1
+ result[1][1] = -1
+ p.Finished = true
+ }
+
+ return result
+}
+
+func playMall(mall [4][4]rune) [][2][2]int {
+ log := [][2][2]int{}
+ people := []*person{}
+ peopleCount := 0
+
+ for i := 0; i < 4; i++ {
+ for j := 0; j < 4; j++ {
+ if mall[i][j] == 'X' {
+ people = append(people, newPerson(i, j))
+ peopleCount++
+ }
+ }
+ }
+
+ activePeople := true
+
+ for activePeople {
+ activePeople = false
+
+ for i := 0; i < peopleCount; i++ {
+ if !people[i].Finished {
+ log = append(log, people[i].move(&mall))
+ activePeople = true
+ }
+ }
+ }
+
+ return log
+}
В решението ти няма никаква конкурентност. Всичко върви последователно.
В условието изрично пише:
Обитателите трябва да се мърдат паралелно един с друг и независимо един от друг. Не се опитвайте да изпълнявате всичко последователно.