HDU4101-很好的BFS题目(虽然结果是判断输赢)

2024-05-04 19:48
文章标签 题目 bfs 判断 输赢 hdu4101

本文主要是介绍HDU4101-很好的BFS题目(虽然结果是判断输赢),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:题目链接

 

 

题意:题目的意思就是说两个人轮流玩游戏,给你一张地图,这个地图中间有一点-1代表宝藏,Ali and Baba轮流走

路,如果某一个人能够直接走到宝藏的话,那么他就赢了。地图上其它的点0代表空地,数字代表当前地点的石子当

某一人拿石子的时候,他只能拿走一颗。问你谁最后能拿到宝藏;

 

分析:宝藏位于-1的位置,那么如果Ali一开始的时候就可以通过外围的某一点的空地直接经过空地到达宝藏,那么

Ali就赢了,所以我们应该以-1为起点,广搜一次,这样,我们就可以找到可以链接到宝藏的直接路径了(记作区域

A),如果广搜过程中碰见了空地边缘,那么Ali必赢(Ali直接从这里进去就可以了)。如果没有的话,那么到达宝

藏的路线肯定被石子包围住了,那么路径周围的石子当都被移动到只剩1棵时,此时当前选手只能选择打开围墙,那

么他就输了。所以就从外围开始由外向内搜索,如果遇到非A区域的石头,总计和ans加上当前位置的石子数目,如果

遇到的是A区域的石头,总计和ans加上当前位置石子数目-1(必须要留下一个石子,否则对方就赢了),最后求得的

ans也就是Ali能够实施的合法步骤数,根据ans的奇偶性便能得出答案。

 

略麻烦的BFS,狂躁ing.....

 

 

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;int gcd(int  n,int  m)
{if(n<m) swap(n,m);return n%m==0?m:gcd(m,n%m);
}
int lcm(int n,int m)
{if(n<m) swap(n,m);return n/gcd(n,m)*m;
}
int prime[100];void getPrime();
void bash();
void wzf();
void SG();
int QuickMod(int a, int b, int n);const int maxn = 305;
int mp[maxn][maxn];
bool vis1[maxn][maxn];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool vis[maxn][maxn];int N, M;
int dx, dy;struct node
{int x, y;
};bool bfs1()
{memset(vis1, false, sizeof vis1);queue<node> Q;node t;t.x = dx, t.y = dy;vis1[dy][dx] = true;Q.push(t);while(!Q.empty()){node cur = Q.front();Q.pop();int cx = cur.x;int cy = cur.y;for(int i = 0; i < 4; i++){int nx = cx + dir[i][0];int ny = cy + dir[i][1];if(nx > 0 && nx <= M && ny > 0 && ny <= N){if(!vis1[ny][nx]){vis1[ny][nx] = true;if(mp[ny][nx] == 0){t.x = nx, t.y = ny;Q.push(t);}}}elsereturn true;}}return false;
}int bfs2()
{memset(vis, false, sizeof vis);int ans = 0;queue<node> Q;node s, t;s.x = 0, s.y = 0;vis[0][0] = true;Q.push(s);while(!Q.empty()){node cur = Q.front();Q.pop();int cx = cur.x;int cy = cur.y;for(int i = 0; i < 4; i++){int nx = cx + dir[i][0];int ny = cy + dir[i][1];if(nx >= 0 && nx <= M + 1 && ny >= 0 && ny <= N + 1){if(!vis[ny][nx]){vis[ny][nx] = true;if(!vis1[ny][nx]){ans += mp[ny][nx];t.x = nx, t.y = ny;Q.push(t);}else if(vis1[ny][nx] && mp[ny][nx] > 0){ans += mp[ny][nx] - 1;}}}}}return ans;
}int main()
{while(scanf("%d %d", &N, &M) != EOF){memset(mp, 0, sizeof mp);for(int i = 1; i <= N; i++){for(int j = 1; j <= M; j++){scanf("%d", &mp[i][j]);if(mp[i][j] == -1)dx = j, dy = i;}}if(bfs1()){puts("Ali Win");continue;}int ans = bfs2();if(ans & 1)puts("Ali Win");elseputs("Baba Win");}return 0;
}
int QuickMod(int  a,int b,int n)
{int r = 1;while(b){if(b&1)r = (r*a)%n;a = (a*a)%n;b >>= 1;}return r;
}void getPrime()
{memset(prime, 0, sizeof(prime));prime[0] = 1;prime[1] = 1;for(int i = 2; i < N; ++i){if(prime[i] == 0){for(int j = i+i; j < N; j+=i)prime[j] = 1;}}
}void bash(int n, int m)
{if(n%(m+1) != 0)printf("1\n");elseprintf("0\n");
}void wzf(int n, int m)
{if(n > m)swap(n, m);int k = m-n;int a = (k * (1.0 + sqrt(5.0))/2.0);if(a == n)printf("0\n");elseprintf("1\n");
}int numsg[100];
void SG(int n)
{int sum = 0;for(int i=0; i < n; i++){scanf("%d",&numsg[i]);sum ^= numsg[i];}if(sum == 0)printf("No\n");else{printf("Yes\n");for(int i = 0; i < n; i++){int s = sum ^ numsg[i];if(s < numsg[i])printf("%d %d\n", numsg[i], s);//从有num[i]个石子的堆后剩余s个石子}}
}


 

这篇关于HDU4101-很好的BFS题目(虽然结果是判断输赢)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959974

相关文章

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int