【bfs】重力球(luogu 7473/NOI Online 2021 普及组 T3)

正题

luogu 7473


题目大意

给出一个正方形区域,中间有一些障碍
现在有两个球,每次操作可以使两个球同时向一个方向移动,直到遇到障碍或边界
现在问你让两个球到同一个位置最少要多少步


解题思路

对于每次操作,球只有可能停在障碍四周的格子内(边界视为障碍),把这些格子记录下来

然后暴力枚举它们之间的连边,这里倒着连边从最终状态转移到初始状态

对于每个这样的点x,建立状态(x,x),两个值分别为当前状态两个点的位置,那么bfs即可

代码

#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 260
using namespace std;
int n, m, q, x, y, w, g, xx, yy, tot, p[N][N], v[N][N], f[N*20][N*20], head[N*20][4], to[N][N][4];
struct rec
{int to, next;
}a[N*20*4];
struct node
{int x, y;
};
queue<node>d;
bool check(int x, int y)
{return p[x + 1][y] || p[x - 1][y] || p[x][y + 1] || p[x][y - 1];
}
void add(int x, int y, int z)
{a[++tot].to = y;a[tot].next = head[x][z];head[x][z] = tot;
}
int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= m; ++i){scanf("%d%d", &x, &y);p[x][y] = 1;}for (int i = 1; i <= n; ++i)p[i][0] = p[i][n + 1] = p[0][i] = p[n + 1][i] = 1;for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)if (!p[i][j] && check(i, j))v[i][j] = ++w;//记下特殊点for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j){to[i][j][0] = p[i][j - 1] ? v[i][j] : to[i][j - 1][0];//查询往各个方向走会到哪个点to[i][j][1] = p[i - 1][j] ? v[i][j] : to[i - 1][j][1];}for (int i = n; i > 0; --i)for (int j = n; j > 0; --j){to[i][j][2] = p[i][j + 1] ? v[i][j] : to[i][j + 1][2];to[i][j][3] = p[i + 1][j] ? v[i][j] : to[i + 1][j][3];}for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)if (v[i][j])for (int k = 0; k < 4; ++k)add(to[i][j][k], v[i][j], k);//连反边memset(f, 127/3, sizeof(f));for (int i = 1; i <= w; ++i){d.push((node){i, i});//最终状态f[i][i] = 0;}while(!d.empty()){node h = d.front();d.pop();for (int k = 0; k < 4; ++k)//bfsfor (int i = head[h.x][k]; i; i = a[i].next)for (int j = head[h.y][k]; j; j = a[j].next)if (f[a[i].to][a[j].to] > 1e8){f[a[i].to][a[j].to] = f[h.x][h.y] + 1;d.push((node){a[i].to, a[j].to});}}while(q--){scanf("%d%d%d%d", &x, &y, &xx, &yy);g = x == xx && y == yy ? 0 : 1e8;for (int k = 0; k < 4; ++k)g = min(g, f[to[x][y][k]][to[xx][yy][k]] + 1);//往其中一个方向走,然后就可以直接使用bfs得出的结果if (g < 1e8) printf("%d\n", g);else puts("-1");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF700E-Cool Slogans【SAM,线段树合并,dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF700E 题目大意 给出一个字符串SSS&#xff0c;求一个最大的kkk使得存在kkk个字符串其中s1s_1s1​是SSS的子串&#xff0c;si1s_{i1}si1​在sis_isi​中出现了至少222次。 解题思路 首先我们需要有两个结论 si1s_{i1}si1​…

[XXSY] 构树(prufer序列,树上连通块DP)

传送门 CayleyCayleyCayley公式&#xff1a;一个完全图有nn−2n^{n-2}nn−2棵无根生成树&#xff08;可用prufer序列证明&#xff09; 扩展CayleyCayleyCayley公式&#xff1a;被确定边分为大小为a1,a2,⋯,ama_1,a_2,\cdots, a_ma1​,a2​,⋯,am​的连通块&#xff0c;则有nm−…

.NET Core中的性能测试工具BenchmarkDotnet

背景介绍之前一篇博客中&#xff0c;我们讲解.NET Core中的CSV解析库&#xff0c;在文章的最后&#xff0c;作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能&#xff0c;本篇我们来详细介绍一下BenchmarkDotNet。原文链接&#xff1a;https://dotnetco…

序列求和

来源&#xff1a;牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 定义S(n) 12 22 … n2&#xff0c;输出S(n) …

【区间DP】摆渡线路(2017 特长生 T4)

题目大意 给出一个园&#xff0c;圆上有100个点&#xff0c;若干条弦&#xff0c;让你选择尽量多互不相交的弦&#xff08;点可以重合&#xff09; 解题思路 可以把圆展开成链&#xff0c;然后复制一遍 设fi,jf_{i,j}fi,j​为第i个位置到第j个位置的所选弦的数量 那么可以枚…

bzoj4589-Hard Nim【FWT】

正题 题目链接:https://darkbzoj.tk/problem/4589 题目大意 求有多少个长度为nnn的数列满足它们都是不大于mmm的质数且异或和为000。 解题思路 两个初始多项式F[0]1F[0]1F[0]1&#xff0c;G[prime≤m]1G[prime\leq m]1G[prime≤m]1&#xff0c;然后答案就是FxorGnF\ xor\ G^…

some useful tricks

异或题思考方向&#xff1a;01trie树&#xff0c;分治 2. 二分图最大匹配&#xff0c;最大独立集互相转换 3. Snow 4. Code 5. Code 6. Code 7. 题目 #include<iostream> #include<cstdio> using namespace std; const int N100010; int n,p,nxt[N],no[200]…

25大技术主题向您发出最后一次约【惠】邀请

一年一度的微软技术盛会即将在上海世博中心拉开大幕金秋十月&#xff0c;来自两岸三地的百名明星讲师将携 25 大技术主题&#xff0c;齐聚上海为您奉献一场无与伦比的技术视听盛宴您&#xff0c;准备好了吗&#xff1f;25大技术主题公开&#xff0c;不负期待姗姗来迟的5系25大技…

P4980-[模板]Pólya定理

正题 题目链接:https://www.luogu.com.cn/problem/P4980 题目大意 nnn个物品图上mmm种颜色&#xff0c;求在可以旋转的情况下本质不同的涂色方案。 解题思路 既然是群论基本题就顺便写一下刚刚了解到的相关知识把&#xff08;顺便消磨一下时间 一个群(G,)(G,\times )(G,)定义…

逆元的求法

逆元&#xff1a; 对于a和p&#xff0c;若 a * inv(a) % p ≡ 1&#xff0c;则称inv(a)为a%p的逆元。其中p为质数 逆元就是在mod下&#xff0c;不能直接除以一个数&#xff0c;而要乘以他的逆元 a * inv(a) 1 (mod p) x / a可以改成 x * inv(a) % p 文章目录方法一.扩展欧几里…

[CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)

树形DP&#xff1a; 设f[u][i]f[u][i]f[u][i]表示给uuu的子树分配工资&#xff0c;uuu点工资为iii的方案数 f[u][i]∏v∈sonu(∑j1if[v][j])f[u][i]\prod\limits_{v\in son_u}(\sum\limits_{j1}^{i}f[v][j])f[u][i]v∈sonu​∏​(j1∑i​f[v][j]) 前缀和优化&#xff1a; 设g[u…

【dfs】益智游戏(2017 特长生 T2)

题目大意 给你四个数字&#xff0c;问你能否经过加减乘除使其结果为24 解题思路 先暴力枚举四个数字的全排列&#xff0c;然后枚举运算符和括号 代码 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long …

分布式系统消息中间件——RabbitMQ的使用基础篇

前言我是在解决分布式事务的一致性问题时了解到RabbitMQ的&#xff0c;当时主要是要基于RabbitMQ来实现我们分布式系统之间对有事务可靠性要求的系统间通信的。关于分布式事务一致性问题及其常见的解决方案&#xff0c;可以看我另一篇博客。提到RabbitMQ&#xff0c;不难想到的…

P4630-[APIO2018]Duathlon铁人两项【圆方树】

正题 题目链接:https://www.luogu.com.cn/problem/P4630 题目大意 nnn个点mmm条边的一张无向图&#xff0c;求有多少对三元组(s,c,f)(s,c,f)(s,c,f)满足s≠f≠ts\neq f\neq ts​f​t且存在一条从sss到fff的简单路径经过ccc 解题思路 一个比较显然的结论是在一个点双中的三…

小a的旅行计划

来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 小a终于放假了&#xff0c;它想在假期中去一些地方…

吃豆人(luogu 7472/NOI Online 2021 普及组 T2)

正题 luogu 7472 题目大意 给出一个正方形点阵&#xff0c;让你选择两个点&#xff0c;分别向两个方向移动&#xff08;必须是45度&#xff09;&#xff0c;每到一个点就得到该点的贡献&#xff08;不重复得&#xff09;&#xff0c;遇到墙壁反射&#xff0c;问你最大贡献 解…

[XSY] 选举(线段树优化dp)

选举 //a[i]1 or 0 or -1,表示i支持小奇 or 中立 or 支持魔法猪 //sum[i]a[1]a[2]...a[i] //设dp[i]表示把1~i划分成若干区间,(小奇得票-魔法猪得票)的最大值 /*dp[i]max {dp[j]1 (sum[i]-sum[j]>0即sum[i]>sum[j])dp[j] (sum[i]-sum[j]0即sum[i]sum[j])dp[j]-1 (sum[…

P3480-[POI2009]KAM-Pebbles【阶梯博弈】

正题 题目链接:https://www.luogu.com.cn/problem/P3480 题目大意 nnn个石头堆上进行Nim\text{Nim}Nim游戏&#xff0c;不过需要满足每次操作前后都有ai≤ai1(i∈[1,n))a_i\leq a_{i1}(\ i\in[1,n)\ )ai​≤ai1​( i∈[1,n) ) 解题思路 让每一个biai−ai−1b_ia_i-a_{i-1}bi​…

在 Centos7 用Jexus服务器 运行.Net Core 只需几步

安装 .Net SDK 不需要按照 .net core runtime,sdk 依赖于运行时会自动安装第一步 添加dotnet源sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm第二步 安装 .Net Core可能由于网络原因&#xff0c;下载要耐心等待一段时间,下载完成后…

小球碰撞(理解ing)

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 一个弹球&#xff08;可视为质点&am…