HDU 4101 Ali and Baba (思路好题)
与其说这是个博弈,倒不如说是个搜索。这题思路不错,感觉很难把情况考虑周全。
在地图外围填充一圈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 (思路好题)的更多相关文章
- HDU 4101 Ali and Baba
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4101 一看之下以为是博弈,后来分析才知道只是搜索题. 首先,我们需要从值为-1的位置由内向外搜索一次, ...
- HDU 2096 小明A+B --- 水题
HDU 2096 /* HDU 2096 小明A+B --- 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen(&quo ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- hdu 4647 - Another Graph Game(思路题)
摘自题解: 若没有边权,则对点权从大到小排序即可.. 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可. ..因为当两个人分别选择不同的点时,这一权值将互相抵消. 代码如下: #include ...
- 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^ ...
- hdu 5480(维护前缀和+思路题)
Conturbatio Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 5071(2014鞍山现场赛B题,大模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 思路:模拟题,没啥可说的,移动的时候需要注意top的变化. #include <iostr ...
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...
- HDU 5122 K.Bro Sorting(模拟——思维题详解)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an A ...
随机推荐
- vue input框设置值 一般对象都是通过打点形式取值
- 2.1-Java语言基础(keyword)
2.1 keyword watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXNpcmVuZQ==/font/5a6L5L2T/fontsize/400/fi ...
- P3391 【模板】文艺平衡树(Splay)
Splay #include<cstdio> #include<algorithm> #include<iostream> using namespace std; ...
- Webpack4 学习笔记五 图片解析、输出的文件划分目录
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack打包图片和划分文件路径 使用图片的方式 通过 new Image() 在 css中设置 background-imag ...
- ECMAscript6(ES6)新特性语法总结(一)
ES6/ES2015,,在ES5的基础上扩展了很多新的功能,在使用的时候要慎重,因为有一部分js代码在部分浏览器是不兼容的,但是所有写在服务器端的代码基本上都支持ES6的写法. 新特性: 一.开启严格 ...
- sql xml扩展字段 查询语句
[cms:sql query="SELECT ContentXML.value('/fields[1]/Address[1]','varchar(max)')AS valueForm FRO ...
- My jdbc 错误
jdbc mysql插入数据提示Parameter index out of range (1 > number of parameters, which is 0). SqlStatement ...
- elasticsearch 5.x 系列之一 开始安装啦
以下是镇楼用的,各路退让,我要吹liubi 了 // // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ...
- c++ tie,ignore
ignore 一个未指定的类型对象,任何值都可以没有影响地赋值给它.通常使用tie来解压一个元组,作为可以忽略的占位符. #include <iostream> #include < ...
- 寻找物体的凸包 opencv
凸包的含义: 在二维平面上给定点集,凸包就是将最外层的点连接起来构成的凸多边形.并且这个凸多边形能包含点集中所有的点.OPENCV中: convexHull函数用于寻找图像点集中的凸包.它有六个输入参 ...