hdu

来源:互联网 发布:心的距离 知乎 编辑:程序博客网 时间:2024/06/11 04:56

虽说博弈,还是找规律题,-1周围dfs一次,然后在外层dfs一次,把-1的边界全都变为1就行了

#pragma comment(linker, "/STACK:102400000,102400000")#include <cstdio>#include <cstring>int s[310][310];bool vis[310][310], arr[310][310];int n, m, p;int xx[] = {0, 1, 0, -1};int yy[] = {-1, 0, 1, 0};bool found;void dfs(int x, int y){    if (x == 0 || y == 0 || x == n + 1 || y == m + 1){        found = true;        return;    }    if(vis[x][y]) return;    vis[x][y] = true;    if(s[x][y] >= 1) return;    for (int i = 0; i < 4; i++)        dfs(x + xx[i], y + yy[i]);}void tarjan(int x, int y){    if (x == 0 || y == 0 || x == n + 1 || y == m + 1) return ;    if(arr[x][y]) return;    arr[x][y] = 1;    if(!vis[x][y]) p += s[x][y];    else {        if(s[x][y] >= 2) p += s[x][y] - 1;        return;    }    for (int i = 0; i < 4; i++)        tarjan(x + xx[i], y + yy[i]);}int main(){//    freopen("in.txt", "r", stdin);    while (scanf("%d%d",&n,&m) != EOF)    {        int opx, opy;        for(int i = 0; i <= n + 1; ++i)        for(int j = 0; j <= m + 1; ++j)        vis[i][j] = arr[i][j] = 0;        for (int i = 1; i <= n; i++)            for (int j = 1; j <= m; j++){                scanf("%d", &s[i][j]);                if (s[i][j] == -1){                    opx = i;                    opy = j;                }            }        found = false;        dfs(opx, opy);        if(found){            puts("Ali Win");            continue;        }        p = 0;        for(int i = 1; i <= n; ++i) {            if(!arr[i][1]) tarjan(i, 1);            if(!arr[i][m]) tarjan(i, m);        }        for(int i = 2; i < m; ++i){            if(!arr[1][i]) tarjan(1, i);            if(!arr[n][i]) tarjan(n, i);        }        if(p % 2 == 1) puts("Ali Win");        else puts("Baba Win");    }    return 0;}