var grid: int[16]; var q: int[64]; fun main() { var y = 0; do { var row = 0; var x = 0; do { var val = getInt(); row |= val << (x << 2); drawData(val * 7); x++; } while (x < 16); row |= row << 1; grid[y] = row; y++; } while (y < 16); var rx = getInt(); var ry = getInt(); var rcoord = (ry << 4) + rx; drawAddr(rcoord); drawData(10); drawSwap(1); while (true) { var fx = getInt(); var fy = getInt(); var fcoord = (fy << 4) + fx; drawAddr(fcoord); drawData(9); q[0] = fcoord; grid[fy] |= 2 << (fx << 2); var qStart = 0; var qSize = 1; do { var qEnd = qSize; for (var qIdx = qStart; qIdx != qEnd; qIdx = (qIdx + 1) & 63) { var coord = q[qIdx]; var ncoord = coord + 16; var ny = ncoord >> 4; var nx = ncoord & 15; var bits = grid[ny] >> (nx << 2); if ((bits & 2) == 0) { //drawAddr(ncoord); //drawData(3); //drawSwap(1); q[qSize] = ncoord; qSize = (qSize + 1) & 63; grid[ny] |= 2 << (nx << 2); } } for (var qIdx = qStart; qIdx != qEnd; qIdx = (qIdx + 1) & 63) { var coord = q[qIdx]; var ncoord = coord - 1; var ny = ncoord >> 4; var nx = ncoord & 15; var bits = grid[ny] >> (nx << 2); if ((bits & 2) == 0) { //drawAddr(ncoord); //drawData(3); //drawSwap(1); q[qSize] = ncoord; qSize = (qSize + 1) & 63; grid[ny] |= 6 << (nx << 2); } } for (var qIdx = qStart; qIdx != qEnd; qIdx = (qIdx + 1) & 63) { var coord = q[qIdx]; var ncoord = coord - 16; var ny = ncoord >> 4; var nx = ncoord & 15; var bits = grid[ny] >> (nx << 2); if ((bits & 2) == 0) { //drawAddr(ncoord); //drawData(3); //drawSwap(1); q[qSize] = ncoord; qSize = (qSize + 1) & 63; grid[ny] |= 10 << (nx << 2); } } for (var qIdx = qStart; qIdx != qEnd; qIdx = (qIdx + 1) & 63) { var coord = q[qIdx]; var ncoord = coord + 1; var ny = ncoord >> 4; var nx = ncoord & 15; var bits = grid[ny] >> (nx << 2); if ((bits & 2) == 0) { //drawAddr(ncoord); //drawData(3); //drawSwap(1); q[qSize] = ncoord; qSize = (qSize + 1) & 63; grid[ny] |= 14 << (nx << 2); } } if (((grid[ry] >> (rx << 2)) & 2) != 0) { break; } qStart = qEnd; } while (qStart != qSize); do { drawAddr(rcoord); drawData(0); var bits = (grid[ry] >> (rx << 2)) & 12; if (bits == 0) rcoord -= 16; else if (bits == 4) rcoord += 1; else if (bits == 8) rcoord += 16; else rcoord -= 1; ry = rcoord >> 4; rx = rcoord & 15; drawAddr(rcoord); drawData(10); drawSwap(1); } while (rcoord != fcoord); var y = 0; do { var row = grid[y]; row &= 0x1111111111111111; row |= row << 1; grid[y] = row; y++; } while (y < 16); } }