与其说这是个博弈,倒不如说是个搜索。这题思路不错,感觉很难把情况考虑周全。

在地图外围填充一圈0,两次BFS,第一次从-1点出发,把从-1到达的0点以及包围0的那一圈石头标记出来。如下图:

  1  1  1  1  1
1 1
1 3 5 1 1
- 1 1

第二次BFS,从外围(0,0)点出发,找出外面与标记石头的交界层:

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

实际上起决定性作用的只有红色的那一圈和那一圈外的石头HP和,里面的石头HP不影响结果。

之前我的BFS只能处理这种情况(如下),就是里面的石头跟外面的那一圈石头是不相连的,却无法处理上面那两种情况(把绿色的3,5,1,4也加上了),所以一直WA……


   -        

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue> using namespace std; const int dx[] = { -, , , };
const int dy[] = { , , -, }; const int MAXN = ; struct Point
{
int x, y;
Point( int x = , int y = ):x(x), y(y) {}
}; bool vis[MAXN][MAXN];
int G[MAXN][MAXN];
bool flag[MAXN][MAXN];
int M, N;
Point st;
int sum;
int ok; void BFS()
{
ok = ;
queue<Point> Q;
Q.push( st );
memset( vis, false, sizeof(vis) );
memset( flag, false, sizeof(flag) );
vis[st.x][st.y] = true;
flag[st.x][st.y] = true;
while ( !Q.empty() )
{
Point cur = Q.front();
Q.pop();
if ( cur.x == || cur.x == N || cur.y == || cur.y == M ) ok = ;
for ( int i = ; i < ; ++i )
{
int xx = cur.x + dx[i];
int yy = cur.y + dy[i];
if ( xx >= && xx <= N && yy >= && yy <= M )
{
if ( !vis[xx][yy] )
{
vis[xx][yy] = true;
flag[xx][yy] = true;
if ( G[xx][yy] == )
Q.push( Point( xx, yy ) );
}
}
}
}
return;
} void BFS2( Point stt )
{
queue<Point> Q;
memset( vis, false, sizeof(vis) );
Q.push( stt );
vis[][] = true; while ( !Q.empty() )
{
Point p = Q.front();
Q.pop();
vis[ p.x ][ p.y ] = true;
sum += G[p.x][p.y];
//printf( "%d %d %d\n", p.x, p.y, G[p.x][p.y] );
for ( int i = ; i < ; ++i )
{
int xx = p.x + dx[i];
int yy = p.y + dy[i];
if ( xx >= && xx <= N+ && yy >= && yy <= M+ && !vis[xx][yy] )
{
vis[xx][yy] = true;
if ( !flag[xx][yy] ) Q.push( Point( xx, yy ) );
else sum += G[xx][yy] - ;
}
}
}
return;
} int main()
{
while ( scanf( "%d%d", &N, &M ) == )
{
memset( G, , sizeof(G) );
for ( int i = ; i <= N; ++i )
for ( int j = ; j <= M; ++j )
{
scanf( "%d", &G[i][j] );
if ( G[i][j] == - ) st = Point( i, j );
} BFS();
if ( ok )
{
puts("Ali Win");
continue;
}
sum = ;
BFS2( Point(, ) );
//printf( "sum=%d\n", sum );
if ( sum % == ) puts("Baba Win");
else puts("Ali Win");
}
return ;
}

HDU 4101 Ali and Baba (思路好题)的更多相关文章

  1. HDU 4101 Ali and Baba

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

  2. HDU 2096 小明A+B --- 水题

    HDU 2096 /* HDU 2096 小明A+B --- 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen(&quo ...

  3. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  4. hdu 4647 - Another Graph Game(思路题)

    摘自题解: 若没有边权,则对点权从大到小排序即可.. 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可. ..因为当两个人分别选择不同的点时,这一权值将互相抵消. 代码如下: #include ...

  5. HDU 1271 整数对(思路题)

    假设删除第k位,把整数A表示成如下形式: A = a * 10^(k+1) + b * 10 ^k + c; 则: B = a * 10^k + c; N = A + B = (11*a+b)*10^ ...

  6. hdu 5480(维护前缀和+思路题)

    Conturbatio Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. hdu 5071(2014鞍山现场赛B题,大模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 思路:模拟题,没啥可说的,移动的时候需要注意top的变化. #include <iostr ...

  8. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

  9. HDU 5122 K.Bro Sorting(模拟——思维题详解)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an A ...

随机推荐

  1. python2.7 加密模块 解决各种坑

    1 Python27 安装crypto Windows安装 在Windows上安装的时候直接 pip install pycrypto会报错,参考:http://blog.csdn.net/teloy ...

  2. cudpp库使用说明

    所有信息是我个人在使用过程中的小小经验,不是什么权威性文档,旨在帮助需要研究此类信息的朋友少走点弯路. 整个项目的主函数,一切从这里开始 在cudpp_testrig右键属性页里找到调试,在命令行里输 ...

  3. Centos防火墙添加IP白名单

    Centos iptables防火墙添加IP白名单,指定IP可访问端口 vi /etc/sysconfig/iptables 以下为我虚拟机的防火墙为例(Centos 7) # sample conf ...

  4. Servlet的工作原理和生命周期

    Servlet的工作原理 . Web服务器加载Servlet:Web服务器启动后,它会根据每个工程的web.xml文件去查找该工程的Servlet,并且找到这些Servlet的Class文件所在的地址 ...

  5. java基础 final 修饰成员变量 只能赋值一次问题

    final int a; public Fu(){ a=1; }

  6. jquery 操作DOM元素(1)

    .clone() 创建一个匹配的元素集合的深度拷贝. .clone([withDataAndEvents]) withDataAndEvents (默认为false) 一个Boolean 表示是否会复 ...

  7. 简单了解一下oracle中的显示游标和存储过程

    游标 游标主要分两类动态和静态游标,静态游标是编译时知道明确的select语句的游标,静态游标分类两种,显示游标和静态游标,这里只说显示游标 显示游标 declare name emp.ename%t ...

  8. 类的特殊方法"__call__"详解

    1. __call__ 当执行对象名+括号时, 会自动执行类中的"__call__"方法, 怎么用? class A: def __init__(self, name): self ...

  9. python错误处理之try...except...finally...错误处理机制。

    今天学习了python的错误处理. 在程序处理的过程中,经常会出现错误,一旦出错就会非常麻烦.所以有的高级语言通常都内置了一套  try...exept...finaly...的错误处理机制,pyth ...

  10. ASPX页面请求响应过程