import java.
util.
concurrent.
atomic.
AtomicInteger
import scala.
collection.
immutable.
VectorBuilder
"0 0 0 0 0 0 0 0 0 0 0 0" +
"/ / / / / / / / / / / /" +
"0/2/3/3/3/3/3/3/3/3/2/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/3/4/4/4/4/4/4/4/4/3/0" +
"/ / / / / / / / / / / /" +
"0/2/3/3/3/3/3/3/3/3/2/0" +
"/ / / / / / / / / / / /" +
"0 0 0 0 0 0 0 0 0 0 0 0"
val BEEPER
_X
= 2 * WALL
_X
val BEEPER
_Y
= 2 * WALL
_Y
val START
_POSITION
= BEEPER
_Y + BEEPER
_X
val BEEPERS0
= 0x02d2fe2e
val BEEPERS1
= 0xd2fe2e02
val BEEPERS2
= 0xfe2e02d2
val BEEPERS3
= 0x2e02d2fe
def walk
(): Vector
[Long
] = {
val lab
= LABYRINTH.
map(_.
toInt).
toArray val rng
= new Random
(id.
getAndIncrement())
def causesPartition
(pos
: Int, dir
: Int
): Boolean
= { (lab(pos + (BEEPERS0 << dir >> 24)) <= '0') &&
(lab(pos + (BEEPERS1 << dir >> 24)) > '0') &&
(lab(pos + (BEEPERS3 << dir >> 24)) > '0')
}
def destinationOpen
(pos
: Int, dir
: Int, n
: Int
) {
lab(pos) = '0'
if (n
<= 1) throw Solution
(lab, pos
)
lab(a) -= 1
lab(b) -= 1
lab(c) -= 1
lab(d) -= 1
if (lab
(a
) == '1') ones +
= 1 if (lab
(b
) == '1') ones +
= 1 if (lab
(c
) == '1') ones +
= 1 if (lab
(d
) == '1') ones +
= 1
beepers = BEEPERS0
walls = WALLS0
beepers = BEEPERS1
walls = WALLS1
beepers = BEEPERS2
walls = WALLS2
beepers = BEEPERS3
walls = WALLS3
}
val beeper
= pos +
(beepers
>> 24) if (lab
(beeper
) >= '0') { val wall
= pos +
(walls
>> 24) lab(wall) = ' '
destinationOpen(beeper, (dir + 8) & 31, n - 1)
lab(wall) = '/'
}
beepers = beepers << 8 | beepers >>> 24;
walls = walls << 8 | walls >>> 24;
n -= 1
}
val beeper
= pos +
(beepers
>> 24) if (lab
(beeper
) == '1') { val wall
= pos +
(walls
>> 24) lab(wall) = ' '
destinationOpen(beeper, (dir + 8) & 31, n - 1)
lab(wall) = '/'
}
beepers = beepers << 8 | beepers >>> 24;
walls = walls << 8 | walls >>> 24;
n -= 1
}
val beeper
= pos +
(beepers
>> 24) if (lab
(beeper
) >= '0') { val wall
= pos +
(walls
>> 24) if (lab
(beeper
) == '1') { lab(wall) = ' '
destinationOpen(beeper, (dir + 8) & 31, n - 1)
lab(wall) = '/'
lab(wall) = ' '
destinationFound(beeper, (dir + 8) & 31, n - 1)
lab(wall) = '/'
}
}
beepers = beepers << 8 | beepers >>> 24;
walls = walls << 8 | walls >>> 24;
n -= 1
}
}
lab(a) += 1
lab(b) += 1
lab(c) += 1
lab(d) += 1
lab(pos) = before
}
def destinationFound
(pos
: Int, dir
: Int, n
: Int
) {
lab(pos) = '0'
if (n
<= 1) throw Solution
(lab, pos
)
lab(a) -= 1
lab(b) -= 1
lab(c) -= 1
lab(d) -= 1
if (lab
(a
) == '1') ones +
= 1 if (lab
(b
) == '1') ones +
= 1 if (lab
(c
) == '1') ones +
= 1 if (lab
(d
) == '1') ones +
= 1
beepers = BEEPERS0
walls = WALLS0
beepers = BEEPERS1
walls = WALLS1
beepers = BEEPERS2
walls = WALLS2
beepers = BEEPERS3
walls = WALLS3
}
val beeper
= pos +
(beepers
>> 24) if (lab
(beeper
) >= '0') { val wall
= pos +
(walls
>> 24) lab(wall) = ' '
destinationFound(beeper, (dir + 8) & 31, n - 1)
lab(wall) = '/'
}
beepers = beepers << 8 | beepers >>> 24;
walls = walls << 8 | walls >>> 24;
n -= 1
}
} else if ((ones
== 1) && (n
== 2)) { val beeper
= pos +
(beepers
>> 24) if (lab
(beeper
) == '1') { val wall
= pos +
(walls
>> 24) lab(wall) = ' '
destinationFound(beeper, (dir + 8) & 31, n - 1)
lab(wall) = '/'
}
beepers = beepers << 8 | beepers >>> 24;
walls = walls << 8 | walls >>> 24;
n -= 1
}
}
/*
if (ones == 0) {
while (i < j) {
val beeper = pos + BEEPERS(i)
if (lab(beeper) >= '0') {
val wall = pos + WALLS(i)
lab(wall) = ' '
destinationFound(beeper, i & 3, n - 1)
lab(wall) = '/'
}
i += 1
}
} else if ((ones == 1) && (n == 2)) {
while (i < j) {
val beeper = pos + BEEPERS(i)
if (lab(beeper) == '1') {
val wall = pos + WALLS(i)
lab(wall) = ' '
destinationFound(beeper, i & 3, n - 1)
lab(wall) = '/'
}
i += 1
}
}
*/
lab(a) += 1
lab(b) += 1
lab(c) += 1
lab(d) += 1
lab(pos) = before
}
destinationOpen(START_POSITION, 0, 95)
Vector(10)
case Solution
(lab, target
) => val vb
= new VectorBuilder
[Long
]
val pos
= y
* BEEPER
_Y + x
* BEEPER
_X
val a
= lab
(pos + WALL
_X
) & 1 val b
= lab
(pos - WALL
_Y
) & 2 val c
= lab
(pos - WALL
_X
) & 4 val d
= lab
(pos + WALL
_Y
) & 8 line = (line << 4) | a | b | c | d
}
vb += (line << 24)
}
vb.result
}
}
}