显示原始代码
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
inline int read() {
int x = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x;
}
inline int myabs(int x) { return x < 0 ? -x : x; }
inline int dis(int a, int b, int c, int d) { return myabs(a - c) + myabs(b - d); }
struct State {
int ax, ay, bx, by;
int xd, jj;
bool flag;
bool operator<(const State b) const {
char *p = (char *)this, *q = (char *)&b;
for (int i = 0; i < 25; ++i) {
if (p[i] != q[i])
return p[i] < q[i];
}
return 0;
}
};
map<State, int> f;
int n, a1, b1, c1, d1, a2, b2, c2, d2;
bool check(int a, int b, int c, int d, int flag) {
if (flag == 1) {
return (a == a1 && b == b1 && c == c1 && d == d1) || (a == c1 && b == d1 && c == a1 && d == b1);
}
return (a == a2 && b == b2 && c == c2 && d == d2) || (a == c2 && b == d2 && c == a2 && d == b2);
}
int cnt = 0;
int solve(int ax, int ay, int bx, int by, int xd, int jj, bool flag) {
State cur = { ax, ay, bx, by, xd, jj, flag };
if (f[cur])
return f[cur];
++cnt;
if (dis(ax, ay, bx, by) == 1) {
if (xd)
return f[cur] = xd + 1;
}
if (ax == bx || ay == by) {
if (jj)
return f[cur] = jj + 1;
}
if (ax == n && ay == n && bx == 1 && by == 1) {
return f[cur] = 1;
}
if (flag) {
int tmp1 = 3, tmp2 = 3;
if (ax < n) {
int nxd = xd, njj = jj;
if (check(ax, ay, ax + 1, ay, 1) && xd == 0)
nxd = 1;
if (check(ax, ay, ax + 1, ay, 2) && jj == 0)
njj = 1;
tmp1 = solve(ax + 1, ay, bx, by, nxd, njj, !flag);
}
if (ay < n) {
int nxd = xd, njj = jj;
if (check(ax, ay, ax, ay + 1, 1) && xd == 0)
nxd = 1;
if (check(ax, ay, ax, ay + 1, 2) && jj == 0)
njj = 1;
tmp2 = solve(ax, ay + 1, bx, by, nxd, njj, !flag);
}
if (tmp1 == 2 || tmp2 == 2)
return f[cur] = 2;
if (tmp1 == 3 && tmp2 == 3)
return f[cur] = 3;
return f[cur] = 1;
} else {
int tmp1 = 2, tmp2 = 2;
if (bx > 1) {
int nxd = xd, njj = jj;
if (check(bx, by, bx - 1, by, 1) && xd == 0)
nxd = 2;
if (check(bx, by, bx - 1, by, 2) && jj == 0)
njj = 2;
tmp1 = solve(ax, ay, bx - 1, by, nxd, njj, !flag);
}
if (by > 1) {
int nxd = xd, njj = jj;
if (check(bx, by, bx, by - 1, 1) && xd == 0)
nxd = 2;
if (check(bx, by, bx, by - 1, 2) && jj == 0)
njj = 2;
tmp2 = solve(ax, ay, bx, by - 1, nxd, njj, !flag);
}
if (tmp1 == 3 || tmp2 == 3)
return f[cur] = 3;
if (tmp1 == 2 && tmp2 == 2)
return f[cur] = 2;
return f[cur] = 1;
}
}
void work() {
n = read();
a1 = read();
b1 = read();
c1 = read();
d1 = read();
a2 = read();
b2 = read();
c2 = read();
d2 = read();
f.clear();
cnt = 0;
switch (solve(1, 1, n, n, 0, 0, 1)) {
case 1:
puts("0");
break;
case 2:
puts("Alice");
break;
case 3:
puts("Bob");
break;
}
}
int main() {
int T = read();
while (T--) work();
}