记搜求助,WA在第二个点18行
查看原帖
记搜求助,WA在第二个点18行
66511
DPair楼主2020/8/19 09:26

数据似乎是

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");
    }
}
2020/8/19 09:26
加载中...