数据似乎是
0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 1 3
answer
Alice
my answer
Deal
但我跑完前17个数据再跑这个数据和直接跑这个数据跑出来结果居然不一样。。。直接跑就对了,肯定是记搜哪里写错了。
求巨佬查错。
大体思路就是枚举后继状态,若后面都是先手必胜,那么我必败,如果后手有一个必败态,那么我必胜,否则认为是陷入循环平局。
设dp[a1][a2][a3][a4][b1][b2][b3][b4]表示当前先手手上1有a1个,2有a2个......的胜负情况,-1表示平局,0表示未知,1先手必胜,2后手必胜。
是我思路错了还是代码挂了?
#include <bits/stdc++.h>
using namespace std;
int dp[9][9][9][9][9][9][9][9];
#define DP1 dp[a1][a2][a3][a4][b1][b2][b3][b4]
int dfs(int a1, int a2, int a3, int a4, int b1, int b2, int b3, int b4){
// printf("a1 = %d, a2 = %d, a3 = %d, a4 = %d, b1 = %d, b2 = %d, b3 = %d, b4 = %d, DP = %d\n", a1, a2, a3, a4, b1, b2, b3, b4, DP1);
if(DP1) return DP1;
DP1 = -1;
bool ckbs = 1, ckbb = 0;
int tmp;
if(a1 && b1) tmp = dfs(b1, b2, b3, b4, a1 - 1, a2 + 1, a3, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a1 && b2) tmp = dfs(b1, b2, b3, b4, a1 - 1, a2, a3 + 1, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a1 && b3) tmp = dfs(b1, b2, b3, b4, a1 - 1, a2, a3, a4 + 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a1 && b4) tmp = dfs(b1, b2, b3, b4, a1 - 1, a2, a3, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a2 && b2) tmp = dfs(b1, b2, b3, b4, a1, a2 - 1, a3, a4 + 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a2 && b3) tmp = dfs(b1, b2, b3, b4, a1, a2 - 1, a3, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a2 && b1) tmp = dfs(b1, b2, b3, b4, a1, a2 - 1, a3 + 1, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a2 && b4) tmp = dfs(b1, b2, b3, b4, a1 + 1, a2 - 1, a3, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a3 && b1) tmp = dfs(b1, b2, b3, b4, a1, a2, a3 - 1, a4 + 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a3 && b2) tmp = dfs(b1, b2, b3, b4, a1, a2, a3 - 1, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a3 && b3) tmp = dfs(b1, b2, b3, b4, a1 + 1, a2, a3 - 1, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a3 && b4) tmp = dfs(b1, b2, b3, b4, a1, a2 + 1, a3 - 1, a4), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a4 && b1) tmp = dfs(b1, b2, b3, b4, a1, a2, a3, a4 - 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a4 && b2) tmp = dfs(b1, b2, b3, b4, a1 + 1, a2, a3, a4 - 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a4 && b3) tmp = dfs(b1, b2, b3, b4, a1, a2 + 1, a3, a4 - 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(a4 && b4) tmp = dfs(b1, b2, b3, b4, a1, a2, a3 + 1, a4 - 1), ckbs = (ckbs && (tmp == 1)), ckbb = (ckbb || (tmp == 2));
if(ckbs) return DP1 = 2;
if(ckbb) return DP1 = 1;
return -1;
}
int f;
int main(){
int T;
for (register int k1 = 0;k1 <= 8;k1 ++){
for (register int k2 = 0;k2 <= 8;k2 ++){
for (register int k3 = 0;k3 <= 8;k3 ++){
for (register int k4 = 0;k4 <= 8;k4 ++){
dp[k1][k2][k3][k4][0][0][0][0] = 2;
dp[0][0][0][0][k1][k2][k3][k4] = 1;
}
}
}
}
dp[0][0][0][0][0][0][0][0] = -1;
scanf("%d", &T);
while(T --){
scanf("%d", &f);
int cnt1[5] = {0, 0, 0, 0, 0}, cnt2[5] = {0, 0, 0 ,0, 0};
for (register int i = 1;i <= 8;i ++){
int x;scanf("%d", &x);
cnt1[x] ++;
}
for (register int i = 1;i <= 8;i ++){
int x;scanf("%d", &x);
cnt2[x] ++;
}
int ret;
if(!f) ret = dfs(cnt1[1], cnt1[2], cnt1[3], cnt1[4], cnt2[1], cnt2[2], cnt2[3], cnt2[4]);
else ret = dfs(cnt2[1], cnt2[2], cnt2[3], cnt2[4], cnt1[1], cnt1[2], cnt1[3], cnt1[4]);
if(!(~ret)) printf("Deal\n");
else printf("%s\n", ret + f != 2? "Alice" : "Bob");
}
}