Codeforces 1064D/1063B Labyrinth】的更多相关文章

原题链接/原题链接(代理站) 题目翻译 给你一个\(n*m\)的迷宫和起始点,有障碍的地方不能走,同时最多向左走\(x\)次,向右走\(y\)次,向上向下没有限制,问你有多少个格子是可以到达的. 输入样例 4 5 3 2 1 2 ..... .***. ...** *.... 输出样例 10 数据范围 \(n,m\leqslant 2000\) 考虑最裸的\(bfs\),开一个队列,从起点开始,每搜到一个格子就打上标记.但是这样显然是错的,考虑下面这组数据: ..... .***. ...*.…
给定$n *m$的格子 询问从$(r, c)$开始最多向左走$x$步,向右走$y$步 询问有多少个格子可以从$(r, c)$到达 有障碍物,$n, m \leqslant 2 * 10^3$ 对于一个点$(x, y)$,可以发现$(r, c)$到$(x, y)$的一条向左走的步数和向右走的步数之和最小的路径可以使得向左走和向右走最优 感性理解是如果比这个大的话,那么必定向左走和向右走的步数同时都要增加 那么带上向左走的步数和向右走的步数来跑$bfs$即可 注意上下之间的权值为$0$ 可以选择将上…
题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当于上下走比左右走优先级大的优先队列),这样可以保证先到某一格时剩余的疲劳度是最大的 但是,,如果上下左右都限制,该咋办啊..有没有大佬能给个思路啊 代码: #include<iostream> #include<cstdio> #include<algorithm> #in…
学习博客:戳这里 附本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 2e3 + 10; 5 const ll mod = 998244353; 6 char st[maxn][maxn]; 7 int vis[maxn][maxn]; 8 int dx[11]={1,-1, 0, 0}; 9 int dy[11]={0, 0, 1,-1}; 10…
D - Labyrinth 对于位置(i,j), j - c = R - L = const(常数), 其中R表示往右走了几步,L表示往左走了几步 所以R越大, L就越大, R越小, L就越小, 所以只需要最小化L和R中的其中一个就可以了 由于每次变化为0或1,所以用双端队列写bfs, 保证最前面的值最小, 简化版的dijkstra 不过看到好多没写双端队列的也过了...... 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma…
先预处理出所有连通块,对于每一个*,看他四周的连通块即可 #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; +; char s[maxn][maxn]; int Map[maxn][maxn]; int n,m; ][]; int Belong[maxn*maxn];//每个点属于哪个联通快 int tot[maxn*maxn…
双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的数目即可. (场上我一般BFS被hack了) 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include…
\(\\\) \(Description\) 给出一个四联通的\(N\times M\) 网格图和起点.图中有一些位置是障碍物. 现在上下移动步数不限,向左至多走 \(a\) 步,向右至多走 \(b\) 步,求从起点出发能到达多少个空地. \(N,M\le 2000\) \(\\\) \(Solution\) 爷们太神了...... 开始的想法是直接跑最短路, \(dist\) 为横向移动总步数. 后来发现矛盾在于,如果到一个格子向左走的步数较少,向右走的步数较多,和这种情况反过来,无法确定那种…
传送门 解题思路 看上去很简单,\(bfs\)写了一发被\(fst\)...后来才知道好像一群人都被\(fst\)了,这道题好像那些每个点只经过一次的传统\(bfs\)都能被叉,只需要构造出一个一块一直上下走,还有一块一直左右走,上下走走到左右走的格子里更优,但已经更新不了,就\(GG\)了.后来学习了一下\(rank1\)的代码,其实用一个双端队列就可以避免这个问题,每次把上下走的放到队头,左右走的放到队尾.这样的话每次左右遍历时一定是最优的. 代码 #include<iostream> #…
题目链接:1063B - Labyrinth/1064D - Labyrinth 题目大意:给定一个\(n\times m\)的图,有若干个点不能走,上下走无限制,向左和向右走的次数分别被限制为\(x\)和\(y\),给出起点并询问有多少个点能够到达. 题解:此题坑多...本弱写裸BFS,WA了一百次_(:з」∠)_ 考虑从点\(A\)到点\(B\)需要向左或者向右走的次数,可以发现若设向左走的次数为\(l\),向右走的次数为\(r\),则\(r-l\)是个定值,因此转换成最短路问题用最短路跑一…