H 扫雷 / 手写哈希+bfs
创始人
2025-05-31 23:00:50
0

扫雷

小明最近迷上了一款名为《扫雷》的游戏。

其中有一个关卡的任务如下:

在一个二维平面上放置着 n个炸雷,第 i个炸雷 (xi,yi,ri)表示在坐标 (xi,yi)处存在一个炸雷,它的爆炸范围是以半径为 ri的一个圆。

为了顺利通过这片土地,需要玩家进行排雷。

玩家可以发射 m个排雷火箭,小明已经规划好了每个排雷火箭的发射方向,第 j个排雷火箭 (xj,yj,rj)表示这个排雷火箭将会在 (xj,yj)处爆炸,它的爆炸范围是以半径为 rj的一个圆,在其爆炸范围内的炸雷会被引爆。

同时,当炸雷被引爆时,在其爆炸范围内的炸雷也会被引爆。

现在小明想知道他这次共引爆了几颗炸雷?

你可以把炸雷和排雷火箭都视为平面上的一个点。

一个点处可以存在多个炸雷和排雷火箭。

当炸雷位于爆炸范围的边界上时也会被引爆。

输入格式
输入的第一行包含两个整数 n、m。

接下来的 n行,每行三个整数 xi,yi,ri,表示一个炸雷的信息。

再接下来的 m 行,每行三个整数 xj,yj,rj,表示一个排雷火箭的信息。

输出格式
输出一个整数表示答案。

数据范围
对于 40%的评测用例:0≤x,y≤109,0≤n,m≤103,1≤r≤10,
对于 100%的评测用例:0≤x,y≤109,0≤n,m≤5×104,1≤r≤10。

输入样例:
2 1
2 2 4
4 4 2
0 0 5

输出样例:
2

样例解释
示例图如下,排雷火箭 1覆盖了炸雷 1,所以炸雷 1被排除;炸雷 1又覆盖了炸雷 2,所以炸雷 2也被排除。
在这里插入图片描述

手写哈希+bfs

一些哈希表的知识点:
手写哈希比直接用map和unordered_map速度快很多,这一题数据很大,所以必须手写哈希。

得到哈希值为return (ll)x * X + y;的解释:
本题m和n范围都是到1e9,故用1e9+1进制的数来表示,如二进制只可能出现0和1,(xy)看成一个1e9+1进制的数,则这个数为 x*(1e9+1)+ y,假设这个值是h,令t = 1e9+1,那么x = h / t,y = h % t,每一对x,y一定是唯一确定的。

得到哈希数组的下标int key = (hs % M + M) % M;的解释:
hs%m保证了这个数为0到m-1,再加m则这个数为m到2*m-1,再对m取余则这个数为1到m-1

本题思路:用bfs,但是如果遍历每个导弹反而更多,再看到题目半径r最大为10,故遍历范围内的每个点判断更快。

#include 
#include 
#include 
using namespace std;const int N = 5e4 + 10, M = 1e6 + 7, X = 1e9 + 1;
int n, m;
struct node {int x, y, r;
}b[N];
typedef long long ll;
ll h[M]; // 哈希数组
bool st[N]; // 判断是否访问过
int id[M], res; // id数组为哈希数组中key对应的地雷下标ll get_hs(int x, int y) { // 得到每个坐标的哈希值return (ll)x * X + y;
}int find(int x, int y) { // 找到该坐标被哈希数组存储的下标keyll hs = get_hs(x, y);int key = (hs % M + M) % M; // 映射到哈希数组内部// 如果该位置已经被占用并且不等于我们要求的哈希值,要在之后找到相应位置while(h[key] != -1 && h[key] != hs) { key++;if(key == M) key = 0; // 哈希表走到末尾,又从0开始}return key;
}// 判断x1,y1为圆心,半径为r的圆是否包含x,y
bool check(int x1, int y1, int r, int x, int y) { int d = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);return d <= r * r;
}void bfs(int pos) {queue q;q.push(pos);st[pos] = 1;while(q.size()) {int t = q.front();q.pop();int x = b[t].x, y = b[t].y, r = b[t].r;for(int xx = x - r; xx <= x + r; xx++) { // 从(x-r, y-r)枚举到(x+r, y+r)for(int yy = y - r; yy <= y + r; yy++) {int key = find(xx, yy); // 找到该坐标点对应的哈希下标// 该点是不是地雷,有没有被访问过,能不能炸到 if(id[key] && !st[id[key]] && check(x, y, r, xx, yy)) { int pos = id[key]; // 获得对应地雷编号st[pos] = 1;q.push(pos);}}}}
}int main() {cin >> n >> m;memset(h, -1, sizeof(h));int x, y, r;for(int i = 1; i <= n; i++) { // 读入地雷,存入哈希表cin >> x >> y >> r;b[i] = {x, y, r};int key = find(x, y);// 找到该坐标点对应的哈希下标if(h[key] == -1) h[key] = get_hs(x, y); // 如果哈希对应位置为空,则插入// id数组没有被标记或者找到了同一个坐标点更大半径的地雷if(!id[key] || b[id[key]].r < r) { id[key] = i;}}for(int i = 1; i <= m; i++) { // 枚举导弹cin >> x >> y >> r;for(int xx = x - r; xx <= x + r; xx++) {for(int yy = y - r; yy <= y + r; yy++) {int key = find(xx, yy);// 如果该点有地雷,没有被访问过,能被炸到if(id[key] && !st[id[key]] && check(x, y, r, xx, yy)) bfs(id[key]);}}}// 遍历每个地雷,看是否被标记for(int i = 1; i <= n; i++) {int key = find(b[i].x, b[i].y); // 获得坐标点对应哈希下标int pos = id[key]; // 哈希下标对应的地雷编号if(pos && st[pos]) res++; // 如果有地雷并且被访问过}cout << res;return 0;
}

相关内容

热门资讯

旅居云南·AI了爱了丨云南小菌... 云南小菌主旅居云南推荐官我是云南的 “小菌主”,妥妥的一枚山野小精灵!说到我的家乡云南,那可是拥有超...
贵州大礼包叠加升级! 5月30日,记者从省政府新闻办新闻发布会获悉,今年贵州为让更多游客与旅游企业享受优惠,开展全年景区门...
甘南,你为什么把「诗和远方」藏... 甘南,你为什么把「诗和远方」藏得这么深?附 6 个治愈到哭的小众角落!在青藏高原的东缘,有一片宛如世...
双飞去黄山旅游三天两晚需要多少... 黄山,作为中国著名的风景名胜区,以其奇松、怪石、云海、温泉四绝闻名于世,一直是众多游客向往的旅游胜地...
甘南的夏天太犯规!草原花海 +... 个藏族自治州之一,属于安多藏区的核心区域,也是藏、汉文化的交汇带,有着丰富的宗教历史和迷人的人文魅力...
四川九寨沟峨眉山旅游旅行团五天... 深入四川:九寨沟与峨眉山五天四晚的奇妙之旅 四川旅游推荐!当地导游-乐乐:185 8335 5758...
黄山五日游多少钱一天?黄山旅游... 黄山,这座被誉为“天下第一奇山”的壮丽之地,一直以来都是我心中的旅游圣地。它的奇松、怪石、云海、温泉...
羊杂汤的北地豪情,牛肉锅的南国... 当北方汉子捧着海碗吸溜羊杂汤时,南方姑娘正用银匙搅动着潮汕牛肉锅的清汤。这场跨越秦岭淮河的“牛羊争霸...
假期第二天,62.32万人次!... 2025年端午假期第二天恰逢“六一”国际儿童节,全市围绕“童心粽情·端午民俗荟”主题,通过“非遗民俗...
端午节广州一景区发现7个莲花奇... 5月31日,广州莲花山旅游区惊现多株莲花奇观。该旅游区工作人员介绍,端午节假期首日,该景区发现了7朵...
一家人去张家界参团旅游5日4晚... 一家人去张家界参团旅游5日4晚价格,张家界旅游五天四晚旅游费用,看这省心又省钱。最近和家人商量着要出...
探索井冈山自驾游攻略:畅享美景... 井冈山,这个在中国革命历史中闪耀着光辉的名字,承载着无数革命故事与美丽的自然风光。作为一个自驾游爱好...
端午不补阳,全年都白忙!8种“... “端午临中夏,时清日复长。”端午时节,阳气旺盛却也暑湿渐重。中医讲究“春夏养阳”,此时补阳祛湿对身体...
济南免费游玩宝典,公园场馆老街... 端午小长假,济南以泉城的胸襟 敞开数十处免费“宝藏地”🎫 护城河环抱着千年古城 博物馆里藏着齐鲁文脉...
原创 关... 近期,酒店行业传出了令人震惊的消息! 5月30日,大理实力希尔顿酒店在拍卖中遭遇流拍。 据了...
起飞15分钟后紧急返航!官方通... 5月31日,中国南方航空微博发布情况通报:5月31日,CZ6850杭州飞往深圳的航班上,一旅客携带的...
桂林 "十八酿&qu... 桂林 “十八酿” 凭借独特风味与文化底蕴悄然火遍网络,成为美食界新宠。豆腐酿、辣椒酿等经典酿菜令人垂...
北京延庆举办美食节 烹制“百里... 人民网北京6月2日电 (记者尹星云)5月31日,2025年北京延庆区美食节暨“画廊美食行”主题活动在...
北京旅游旅行社口碑榜NO.1!... 在北京旅游市场日益火爆的今天,一家名为"好途私人订制"的旅行社悄然登顶口碑榜榜首,成为众多游客心中的...