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

相关文章

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Python如何判断字符串中是否包含特殊字符并替换

《Python如何判断字符串中是否包含特殊字符并替换》这篇文章主要为大家详细介绍了如何使用Python实现判断字符串中是否包含特殊字符并使用空字符串替换掉,文中的示例代码讲解详细,感兴趣的小伙伴可以了... 目录python判断字符串中是否包含特殊字符方法一:使用正则表达式方法二:手动检查特定字符Pytho

判断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