题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4101

题目大意:
给一个矩阵,0表示空的可走,-1宝藏的位置(只有一个),其余的正整数表示该位置石头数。甲乙两个人,轮流玩游戏。甲先玩,谁先从外面通过空路径到达了宝藏的位置(不能经过石头),谁就获胜。如果不能直接到达宝藏位置,可以从外面通过空到某个位置,拿走该位置上的一个石头,如果该位置没有石头则变成空的可走。

解题思路:

不错的BFS。

首先如果甲能一步到达宝藏位置,则甲获胜。

否则,一定有一个环包围着宝藏,则甲肯定不能先捅破这个环,不然乙一步就赢了。所以它尽可能的拿掉环外的石头,同理对于乙来说,也是尽可能的拿掉外面的石头,不能把环打破。

所以只用统计外面石头总数以及环上每个位置留一个石头后的和即可。

如果是奇数,说明甲恰好把最后一个环外的石头拿掉,此时乙必破环。甲胜,否则乙胜。

bfs1() //从宝藏位置从内往外扫描,把该环标记。

bfs2() //从边框bfs,如果走到了边界 +(hp-1) 否则为外面的点 +(hp)

注意:

6 7
1  1  1  1  1  1  1
1  0  0  0  0  0  1
1  0  3  5  1  1  1
1  0  -1 4  0  1  1
1  0  1  0  0  1  1
1  1  1  1  1  1  1

ans=16 不是22

这组测试数据 计数的时候是不包括3,5的,因为环已经包括了。(wa了一上午)不能直接统计空的,非空的也要标记,只不过不放到队列中而已,要换个姿势。

还有要注意这组测试数据:

7 7
1 1 1  1 1 1 1
1 1 0  0 0 0 1
1 0 0  1 0 0 1
1 0 1  1 1 0 1
1 0 0  1 0 0 1
1 0 0 -1 0 0 1
1 1 1  1 1 1 1

环内有有数。

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/ #define Maxn 320
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int mm[Maxn][Maxn],n,m;
bool vis[Maxn][Maxn];
bool vis2[Maxn][Maxn]; struct Node
{
int x,y;
};
Node s; bool isbor(int x,int y) //是否为边界
{
if(x==1||y==1||x==n||y==m)
return true;
return false;
}
bool iscan(int x,int y) //是否在
{
if(x<1||x>n||y<1||y>m)
return false;
return true;
} bool bfs1()
{
memset(vis,false,sizeof(vis));
queue<Node>myq;
myq.push(s);
vis[s.x][s.y]=true;
if(isbor(s.x,s.y))
return true;
while(!myq.empty())
{
Node cur=myq.front();
//printf(":%d %d\n",cur.x,cur.y);
myq.pop();
for(int i=0;i<4;i++)
{
int xx=cur.x+dir[i][0],yy=cur.y+dir[i][1];
if(!iscan(xx,yy))
continue;
if(isbor(xx,yy)&&mm[xx][yy]==0) //空位置 伸到了外面
return true;
if(vis[xx][yy])
continue;
vis[xx][yy]=true;
if(mm[xx][yy]) //这也标记下 防止内部的干扰
continue;
Node tmp;
tmp.x=xx,tmp.y=yy;
myq.push(tmp);
//printf("push:%d %d\n",tmp.x,tmp.y);
}
}
return false;
} int bfs2()
{
int res=0;
queue<Node>myq;
myq.push(s);
vis2[s.x][s.y]=true;
//res+=mm[s.x][s.y];
while(!myq.empty())
{
Node cur=myq.front();
myq.pop();
for(int i=0;i<4;i++)
{
int x=cur.x+dir[i][0],y=cur.y+dir[i][1];
// printf("x:%d y:%d\n",x,y);
if(!iscan(x,y)||vis2[x][y]) //是否被访问了
continue;
vis2[x][y]=true;
if(vis[x][y]) //如果是内边界
{
res+=(mm[x][y]-1); //直接+(hp-1)
continue;
}
//其它的点 +hp
Node tmp;
tmp.x=x,tmp.y=y;
res+=mm[x][y];
myq.push(tmp);
}
}
return res;
} int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&mm[i][j]);
if(mm[i][j]==-1)
s.x=i,s.y=j;
}
if(bfs1())
{
printf("Ali Win\n");
continue;
}
/* putchar('\n');
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",vis[i][j]);
putchar('\n');
}*/
int ans=0;
memset(vis2,false,sizeof(vis2)); //统计外围是否被访问了
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(isbor(i,j)) //从边界开始扫
{
if(vis2[i][j]) //之前已经扫过了
continue;
vis2[i][j]=true;
if(vis[i][j]) //碰到了边界 直接+(hp-1)
ans+=(mm[i][j]-1);
else
{
ans+=mm[i][j]; //不是边界 加上然后继续扫
s.x=i,s.y=j;
ans+=bfs2();
}
}
}
// printf(":%d\n",ans);
if(ans&1)
printf("Ali Win\n");
else
printf("Baba Win\n");
}
return 0;
}

BFS-hdu-4101-Ali and Baba的更多相关文章

  1. HDU 4101 Ali and Baba

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4101 一看之下以为是博弈,后来分析才知道只是搜索题. 首先,我们需要从值为-1的位置由内向外搜索一次, ...

  2. HDU 4101 Ali and Baba (思路好题)

    与其说这是个博弈,倒不如说是个搜索.这题思路不错,感觉很难把情况考虑周全. 在地图外围填充一圈0,两次BFS,第一次从-1点出发,把从-1到达的0点以及包围0的那一圈石头标记出来.如下图: 1 1 1 ...

  3. hdu 4101

    比赛的时候先是受以前一个圣神海的题目 用了两遍DFS 第一遍标记出围墙  第二遍求围墙外和每块围墙降为1所需的攻击次数  结果爆栈  改为BFS后AC DFS的加了一句这个 #pragma comme ...

  4. hdu - 1195 Open the Lock (bfs) && hdu 1973 Prime Path (bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1195 这道题虽然只是从四个数到四个数,但是状态很多,开始一直不知道怎么下手,关键就是如何划分这些状态,确保每一个 ...

  5. ZOJ-1649 Rescue BFS (HDU 1242)

    看题传送门: ZOJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 HDU http://acm.hdu.edu. ...

  6. [DLX+bfs] hdu 4069 Squiggly Sudoku

    题意: 给你9*9的矩阵.对于每一个数字.能减16代表上面有墙,能减32代表以下有墙. .. 最后剩下的数字是0代表这个位置数要求,不是0代表这个数已知了. 然后通过墙会被数字分成9块. 然后做数独, ...

  7. CSU-ACM2018暑假集训6—BFS

    可以吃饭啦!!! A:连通块 ZOJ 1709 Oil Deposits(dfs,连通块个数) B:素数变换 打表+bfs POJ 3216 Prime Path(打表+bfs) C:水bfs HDU ...

  8. 康托展开+反向bfs

    康托展开+反向bfs hdu 1043 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 #include <iostream> # ...

  9. 阿里校招内推C++岗位编程题第一题 空格最少的字符串

    给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成.并输出解. 如果没有解则应该输出n/a 例如: 输入: S = “ilikealibab ...

  10. 1.1.1最短路(Floyd、Dijstra、BellmanFord)

    转载自hr_whisper大佬的博客 [ 一.Dijkstra 比较详细的迪杰斯特拉算法讲解传送门 Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkstra常常作为其他算 ...

随机推荐

  1. WPF之Treeview控件简单用法

    TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...

  2. Xcode7之后常见问题整理-b

    一.Xcode7,iOS9之后传出来的什么Xcode有鬼,被植入代码片段什么的,可以看看,了解一下http://drops.wooyun.org/news/8864 二.bitcode问题--未正确设 ...

  3. 全连接的BP神经网络

    <全连接的BP神经网络> 本文主要描述全连接的BP神经网络的前向传播和误差反向传播,所有的符号都用Ng的Machine learning的习惯.下图给出了某个全连接的神经网络图. 1前向传 ...

  4. OpenJDK与HashMap

    OpenJDK的非堆JDK增强提议(JDK Enhancement-Proposal,JEP)试图标准化一项基础设施,它从Java6开始,只能在HotSpot和OpenJDK内部使用.这种设施能够像管 ...

  5. Shoot the Bullet

    zoj3229:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 题意:一个摄影师,在n天内给m个女神拍照.每个女神至少要 ...

  6. gcc c语言中scanf输入格式不正确,清空缓冲区问题

    我的博客:www.while0.com 折磨了一下午,只因为fflush(stdin)再gcc里和vc里表现不一致.gcc里不能够清空缓冲区.直接上例子: #include <stdio.h&g ...

  7. Java中类Exchaner浅析

    Exchaner用于实现两个人之间的数据交换,每个人在完成一定的事物后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据. 张孝祥老师在讲解Exchaner时的比 ...

  8. android.graphics.Matrix

    Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTra ...

  9. Spark安装和配置

    hadoop2的安装教程 Spark可以直接安装在hadoop2上面,主要是安装在hadoop2的yarn框架上面 安装Spark之前需要在每台机器上安装Scala,根据你下载的Spark版本,选择对 ...

  10. Spark RCFile的那些“坑”

    RCFile在平台的应用场景中多数用于存储需要“长期留存”的数据文件,在我们的实践过程中,RCFile的数据压缩比通常可以达到8 : 1或者10 : 1,特别适用于存储用户通过Hive(MapRedu ...