显示原始代码
#include <bits/stdc++.h>
using namespace std;
const int N = 35;
int n;
int a1, a2, b1, b2;
int c1, c2, d1, d2;
int dp[N][N][N][N][3][3];
bool vis[N][N][N][N][3][3];
int tt(int x1, int y1, int x2, int y2) {
int t1 = x1 + y1 - 2;
int t2 = 2 * n - x2 - y2;
return t1 > t2;
}
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
bool cp1(int x1, int y1, int xx, int yy) {
if (x1 == a1 and y1 == b1 and xx == c1 and yy == d1)
return true;
if (x1 == c1 and y1 == d1 and xx == a1 and yy == b1)
return true;
return false;
}
bool cp2(int x1, int y1, int xx, int yy) {
if (x1 == a2 and y1 == b2 and xx == c2 and yy == d2)
return true;
if (x1 == c2 and y1 == d2 and xx == a2 and yy == b2)
return true;
return false;
}
int chk(int x1, int y1, int x2, int y2, int t1, int t2) {
int d = abs(x1 - x2) + abs(y1 - y2);
if (d <= 1) {
if (t1 == 1)
return 1;
if (t2 == 1)
return -1;
}
if (x1 == x2 or y1 == y2) {
if (t1 == 2)
return 1;
if (t2 == 2)
return -1;
}
return 0;
}
int f(int x1, int y1, int x2, int y2, int t1, int t2) {
if (vis[x1][y1][x2][y2][t1][t2])
return dp[x1][y1][x2][y2][t1][t2];
vis[x1][y1][x2][y2][t1][t2] = true;
if (x1 == n and y1 == n and x2 == 1 and y2 == 1) {
dp[x1][y1][x2][y2][t1][t2] = 0;
return 0;
}
int t = tt(x1, y1, x2, y2), d, ansk;
if (t == 0) {
ansk = -1;
for (int k = 0, xx, yy, tt; k < 2; k++) {
xx = x1 + dx[k];
yy = y1 + dy[k];
if (xx < 1 or xx > n or yy < 1 or yy > n)
continue;
if (!t1 and t2 != 1) {
if (cp1(x1, y1, xx, yy)) {
d = chk(xx, yy, x2, y2, 1, t2);
if (d == 1) {
dp[x1][y1][x2][y2][t1][t2] = 1;
return 1;
} else if (d == -1) {
continue;
}
d = f(xx, yy, x2, y2, 1, t2);
if (d == 1) {
dp[x1][y1][x2][y2][t1][t2] = 1;
return 1;
}
ansk = max(ansk, d);
}
}
if (!t1 and t2 != 2) {
if (cp2(x1, y1, xx, yy)) {
d = chk(xx, yy, x2, y2, 2, t2);
if (d == 1) {
dp[x1][y1][x2][y2][t1][t2] = 1;
return 1;
} else if (d == -1) {
continue;
}
d = f(xx, yy, x2, y2, 2, t2);
if (d == 1) {
dp[x1][y1][x2][y2][t1][t2] = 1;
return 1;
}
ansk = max(ansk, d);
}
}
d = chk(xx, yy, x2, y2, t1, t2);
if (d == 1) {
dp[x1][y1][x2][y2][t1][t2] = 1;
return 1;
} else if (d == -1) {
continue;
}
d = f(xx, yy, x2, y2, t1, t2);
if (d == 1) {
dp[x1][y1][x2][y2][t1][t2] = 1;
return 1;
}
ansk = max(ansk, d);
}
dp[x1][y1][x2][y2][t1][t2] = ansk;
return ansk;
} else {
ansk = 1;
for (int k = 2, xx, yy, tt; k < 4; k++) {
xx = x2 + dx[k];
yy = y2 + dy[k];
if (xx < 1 or xx > n or yy < 1 or yy > n)
continue;
if (!t2 and t1 != 1) {
if (cp1(x2, y2, xx, yy)) {
d = chk(x1, y1, xx, yy, t1, 1);
if (d == -1) {
dp[x1][y1][x2][y2][t1][t2] = -1;
return -1;
} else if (d == 1) {
continue;
}
d = f(x1, y1, xx, yy, t1, 1);
if (d == -1) {
dp[x1][y1][x2][y2][t1][t2] = -1;
return -1;
}
ansk = min(ansk, d);
}
}
if (!t2 and t1 != 2) {
if (cp2(x2, y2, xx, yy)) {
d = chk(x1, y1, xx, yy, t1, 2);
if (d == -1) {
dp[x1][y1][x2][y2][t1][t2] = -1;
return -1;
} else if (d == 1) {
continue;
}
d = f(x1, y1, xx, yy, t1, 2);
if (d == -1) {
dp[x1][y1][x2][y2][t1][t2] = -1;
return -1;
}
ansk = min(ansk, d);
}
}
d = chk(x1, y1, xx, yy, t1, t2);
if (d == -1) {
dp[x1][y1][x2][y2][t1][t2] = -1;
return -1;
} else if (d == 1) {
continue;
}
d = f(x1, y1, xx, yy, t1, t2);
if (d == -1) {
dp[x1][y1][x2][y2][t1][t2] = -1;
return -1;
}
ansk = min(ansk, d);
}
dp[x1][y1][x2][y2][t1][t2] = ansk;
return ansk;
}
}
int main() {
int tests;
scanf("%d", &tests);
while (tests--) {
scanf("%d", &n);
scanf("%d%d%d%d", &a1, &b1, &c1, &d1);
scanf("%d%d%d%d", &a2, &b2, &c2, &d2);
memset(vis, 0, sizeof vis);
int d = f(1, 1, n, n, 0, 0);
if (d == 1)
puts("Alice");
else if (d == -1)
puts("Bob");
else
puts("0");
}
return 0;
}