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

在地图外围填充一圈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. 遍历ResultSet,行列要从1开始

    为什么遍历ResultSet,行列要从1开始. 因为Resultset的第一行的第一列都是空的,要用rs.next()到第一行才能进行读取. Statement stmt=null;  ResultS ...

  2. 从Java官网下载JDK1.6等低版本JDK

    今天在浏览Java官网的时候发现旧版本(1.8之前)的JDK安装包下载地址没有在下载页面明显的提供出来.个人通过在官网查看,发现oracle官方将旧版本的JDK全都放在Java Archive模块中了 ...

  3. 数据对齐 posix_memalign 函数详解

    对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...

  4. 【javascript】ajax 基础

    什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...

  5. Login用户登录(Python实现)

    username_fault = "isuperSun" #程序存储用户名和密码 password_fault = " counts = 0 while counts&l ...

  6. HTML第二章:列表,表格,媒体元素

    第二章:列表,表格,媒体元素 列表:有三种,有序列表,无序列表,定义列表 1.有序列表:<ol></ol>            列表项:<li></li&g ...

  7. JS浏览器的三种弹框:

    1.alert:使用alert弹框提示信息,最后都会被转化为字符串输出(因为调用了toString这个方法).比如alert(1+1)弹出的结果应该是字符串形式的“2”. 2.Confirm:在ale ...

  8. 使用Docker 一键部署 LNMP+Redis 环境

    使用Docker 部署 LNMP+Redis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...

  9. dts--tests(一)

    cmdline.py """ DPDK Test suite. Test cmdline. """ import utils from te ...

  10. 12 new方法和单例、定制访问函数、装饰器

    new方法和单例.定制访问函数.装饰器 上节课作业解答 # 通过多重继承方法,分别定义出动物,人类,和和荷兰人三种类 class Animal(object): def __init__(self, ...