HDU 4101 Ali and Baba

两次广搜

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;

const int maxn=305;
int N,M,Sx,Sy;
int Map[maxn][maxn];
int Y[maxn][maxn];
int e[maxn][maxn];
int flag[maxn][maxn];
int Flag[maxn][maxn];
int F[maxn][maxn];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int ans,sum;

struct Point
{
    int x,y;
    Point(int a,int b){x=a;y=b;}
};
void init()
{
    memset(flag,0,sizeof flag);//标记有没有走过
    memset(F,0,sizeof F);//标记是否是边界
    memset(Map,0,sizeof Map);
    memset(Flag,0,sizeof Flag);
    memset(e,0,sizeof e);
    memset(Y,0,sizeof Y);
    ans=-1,sum=0;
}

void read()
{
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
        {
            scanf("%d",&Map[i][j]);
            Y[i][j]=Map[i][j];
        }
}

void bfs1()
{
    queue<Point>Q;
    Point p(Sx,Sy);
    flag[Sx][Sy]=1;
    Q.push(p);
    while(!Q.empty())
    {
        Point p=Q.front(); Q.pop();

        if(Map[p.x][p.y]!=0&&Map[p.x][p.y]!=-1)
        {
            F[p.x][p.y]=1;//边界标1
            continue;
        }

        for(int i=0;i<4;i++)
        {
            int NewX=p.x+dir[i][0];
            int NewY=p.y+dir[i][1];
            if(!flag[NewX][NewY])
                if(NewX>=1&&NewX<=N)
                    if(NewY>=1&&NewY<=M)
                    {
                        flag[p.x][p.y]=1;
                        Point p(NewX,NewY);
                        Q.push(p);
                    }
        }
    }
    /*
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
            printf("%d",F[i][j]);
        printf("\n");
    }
    */
}

void bfs2()
{
    queue<Point>Q;
    Point p(0,0);
    Flag[0][0]=1;
    Q.push(p);
    while(!Q.empty())
    {
        Point p=Q.front(); Q.pop();
        //printf("%d  %d  %d\n",p.x,p.y,Map[p.x][p.y]);

        if(Map[p.x][p.y])
        {
            if(F[p.x][p.y])
            {
                sum=sum+Map[p.x][p.y]-1;
                continue;
            }
            else sum=sum+Map[p.x][p.y];
        }

        for(int i=0;i<4;i++)
        {
            int NewX=p.x+dir[i][0];
            int NewY=p.y+dir[i][1];
            if(Flag[NewX][NewY]==0)
                if(NewX>=0&&NewX<=N+1)
                    if(NewY>=0&&NewY<=M+1)
                    {
                        Flag[NewX][NewY]=1;
                        Point p(NewX,NewY);
                        Q.push(p);
                    }
        }
    }

}

void dfs(int x,int y)
{
    if(x==0||x==N+1||y==0||y==M+1) {ans=1;return;}
    e[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int NewX=x+dir[i][0];
        int NewY=y+dir[i][1];
        if(Y[NewX][NewY]==0)
            if(e[NewX][NewY]==0)
                dfs(NewX,NewY);
    }
}

void solve()
{
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            if(Map[i][j]==-1)
                Sx=i,Sy=j;
    e[Sx][Sy]=1;dfs(Sx,Sy);
    if(ans==1){printf("Ali Win\n");return;}
    bfs1();
    bfs2();
  //  printf("%d\n",sum);
    if(sum%2==1) printf("Ali Win\n");
    else printf("Baba Win\n");
}

int main()
{
    while(~scanf("%d%d",&N,&M))
    {
        init();
        read();
        solve();
    }
    return 0;
}
时间: 2024-08-07 16:56:36

HDU 4101 Ali and Baba的相关文章

hdu 4101 Ali and Baba【BFS好题】

Ali and Baba Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2172    Accepted Submission(s): 460 Problem Description There is a rectangle area (with N rows and M columns) in front of Ali and Ba

!HDU 4101 Ali and Baba-博弈-(bfs&amp;dfs扫描二维点)

题意:目标是拿到值为-1的宝石,但是前提是要有一条从二维格子外面到宝石的通路,如果没有就要每次选一个石头使它的值减1,直到石头的值为0则变为通路,能选这个石头的前提也是有一条格子外到该石头的通路,A和B开始游戏,两人轮流来,每次选一个石头,A先开始,求由输入的条件,谁能赢. 分析: 博弈问题,两人会把围住宝石的一圈石头外面的石头全部敲碎然后才选这一圈石头,所以就是计算这一圈石头外面的所有石头的值的和,再加上这一圈石头的值减一的和,通过奇偶就能判断谁赢. 实现方法:从宝石dfs找出围住它的一圈石头

(bfs+dfs) hdu 4101

Ali and Baba Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1799    Accepted Submission(s): 378 Problem Description There is a rectangle area (with N rows and M columns) in front of Ali and Bab

HDU4101 Ali and Baba (bfs+dfs+博弈)

题意: Ali 和Baba玩游戏,游戏是在给出的一个n*m的图中,有且仅有一个宝藏(-1)表示,图中其他位置可能是空地(0表示),也可能是石头(石头的HP用一个正数表示).二人轮流,每次游戏开始都是Ali先手,选手可以攻击石头,每次可以让石头HP减少一.问Ali是否可以胜利. 开始时,直接BFS 宝藏能扩展的最大的面积,因为面对都是1包围的-1 ,这个是必败态.但是WA了:然后想了很久,想到,可能存在宝藏所形成的连通的块是个环形,把其他的石头包围在里面,这样,这些石头就等于是没用的了.所以不得不

HDU 4101 有意思的广搜

题意:在一个n*n的矩阵内,两个人想要找到一个 " 宝藏 ",用-1表示.其中有空地,每回合可任意穿梭,用0表示,有怪物,无法直接穿过,需要杀死,每回合砍1 HP,等于0时死亡,由两人从最外围开始,每人一回合行动,问谁能获得 "  宝藏  " . 题解: 看似博弈 ,同样可以从必胜状态考虑,当宝藏周围只剩下最后一圈血量为1的怪物时,  谁先打死那个怪物,谁就输了. 两人都不愿意杀死那只堵着宝藏门的第一只怪 ,所以两人的状态就是一直在砍门外面的怪,你一刀我一刀.所以我

HDU 5919 Sequence II(主席树+逆序思想)

Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1422    Accepted Submission(s): 362 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2

Instrction Arrangement (hdu 4109 差分约束)

Instrction Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1395    Accepted Submission(s): 584 Problem Description Ali has taken the Computer Organization and Architecture course th

HDU 4622 Reincarnation Hash解法详解

今天想学字符串hash是怎么弄的.就看到了这题模板题 http://acm.hdu.edu.cn/showproblem.php?pid=4622 刚开始当然不懂啦,然后就上网搜解法.很多都是什么后缀自动机那些.作为小白的我当然不懂啦,更重要的是我想学的是字符串hash这种解法呢?然而有这种解法,但是却都是只有代码,看起来很辛苦.所以这里我把我的理解写上来,当然有错误的话,请各路高手指出来,我也好好学习下~~ 首先介绍一个字符串Hash的优秀映射函数:BKDRHash,这里hash一开始是等于0

HDU 5223 GCD

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5223 题面: GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 4    Accepted Submission(s): 0 Problem Description In mathematics, the greatest com