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

在地图外围填充一圈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. redis 有序集合类型

  2. 解决windows下Composer因php_openssl扩展缺失而安装失败的问题

    Composer( https://getcomposer.org/ )是PHP下的一个依赖管理工具.你可以在你的项目中声明你所需要用到的类库,然后Composer会在项目中为你安装它们.如果你了解N ...

  3. 第2章-如何安装KEIL5—零死角玩转STM32-F429系列

    第2章     如何安装KEIL5 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章内 ...

  4. 2.初识CronTrigger

    开发工具:Eclipse 代码下载链接:https://github.com/theIndoorTrain/QuartzDemo.git 前言: 在1.初始Quartz里面,我们介绍了quartz的一 ...

  5. Linux系统崩溃,数据迁移

    就在1小时前,处理了件如标题所述的麻烦事儿.吃完午饭,想对此作个总结,一来自己梳理下过程以便后面遇见类似的事可以 快速处理,二来同行的小伙伴们可以探讨下.故事是这样的,公司所在园区物业晚上断电8小时, ...

  6. Yii2 设计模式

    一. 单例模式 顾名思义, 单例模式就是只实例一次,通过一个接口去实现多处需要的同一类对象的需求. 例子: public function __construct($config = []) { Yi ...

  7. 将Komodo Edit打造成Python开发的IDE

    Komodo Edit 支持Python 界面清爽, 将Komodo Edit 设置成Python的IDE,具体操作方法如下: 先添加自定义命令. 再设置命令行参数 设置高级选项 设置快捷键 完成.

  8. mysql 安装常用命令,卸载不干净等

    安装mysql apt-get install mysql-server apt-get install mysql-client sudo apt-get install libmysqlclien ...

  9. C语言函数篇(二)函数参数基础设计

    形参实现一种数据传入的接口 ,由 实参 拷贝给 形参. 拷贝!!!!!!!!!!! 例1: void func(int tmp){ //意图是实现传进来的参数 +1 tmp++; } int mian ...

  10. POJ:1222-EXTENDED LIGHTS OUT(矩阵反转)

    EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12956 Accepted: 8186 ...