首页 > 其他分享 >[题解]CF1063B Labyrinth

[题解]CF1063B Labyrinth

时间:2024-11-28 15:35:13浏览次数:11  
标签:vis Labyrinth 题解 yy int CF1063B 步数

CF1063B Labyrinth ~ Codeforces

数据范围较小,考虑使用搜索。

由于向左向右的步数限制过大,我们只能用\(x,y\)进行记忆化,否则空间和时间都过不去。

既然状态只有\(x,y\),我们就要让最优情况最先被遍历到,所以考虑BFS。

我们考虑,对于\((x,y)\)状态来说,什么样的情况是最优的?

显然,对于上图所示情况,中间的路径是最优的。

不难发现,从起点\((r,c)\)到终点\((x,y)\),“向右的步数\(-\)向左的步数”是固定值,也就是说,向右走得越多,向左也要走得越多,反之亦然。并不存在“通过多付出向右走的代价以减少向左走的代价”。所以我们可以认为,向左右走的总次数越少,该情况越不劣。

又因为每次操作花费只有\(0,1\)两种,所以任何时刻,队列中的操作总花费最多是\(2\)个相邻的整数。进而,我们可以采用0-1 BFS来求解,开一个双端队列,如果此次操作花费为\(1\)则放在队尾,否则放在队头,就可以保证每次从队头取出的都是最优的情况。

点击查看代码
#include<bits/stdc++.h>
#define N 2002
using namespace std;
struct Status{int x,y,l,r;};
int n,m,x,y,l,r,ans,dx[4]{-1,0,1,0},dy[4]{0,1,0,-1};
string s[N];
deque<Status> q;
bitset<N> vis[N];
signed main(){
	cin>>n>>m>>x>>y>>l>>r;
	for(int i=1;i<=n;i++) cin>>s[i],s[i]=' '+s[i];
	q.push_back({x,y,l,r});
	ans=vis[x][y]=1;
	while(!q.empty()){
		Status sta=q.front();
		q.pop_front();
		for(int i=0;i<4;i++){
			int xx=sta.x+dx[i],yy=sta.y+dy[i],tl=sta.l,tr=sta.r;
			if(dy[i]==1) tr--; else if(dy[i]==-1) tl--;
			if(xx<1||yy<1||xx>n||yy>m||s[xx][yy]=='*'||vis[xx][yy]||tl<0||tr<0) continue;
			vis[xx][yy]=1,ans++;
			if(i==1) q.push_back({xx,yy,sta.l,sta.r-1});
			else if(i==3) q.push_back({xx,yy,sta.l-1,sta.r});
			else q.push_front({xx,yy,sta.l,sta.r});
		}
	}
	cout<<ans<<"\n";
	return 0;
}

标签:vis,Labyrinth,题解,yy,int,CF1063B,步数
From: https://www.cnblogs.com/Sinktank/p/18574301

相关文章

  • AT_nikkei2019_2_qual_d Shortest Path on a Line 题解
    洛谷题目传送门AT题目传送门博客园可能食用更佳学校内部模拟赛出了这题,顺便来写下题解。惊奇的发现题解区居然全是建图跑最短路,这怎么行,所以这一篇题解并没有跑任何最短路,而是使用了线段树优化DP。考虑将建边区间按右端点从小到大排序,每次以右端点为枚举编号,记作\(x\),发......
  • 【题解】洛谷P5906:【模板】回滚莫队&不删除莫队
    对于一些区间问题,虽然莫队好进行加操作,但并不好进行减操作,所以我们引出了回滚莫队。【模板】回滚莫队&不删除莫队发现我们并不总是知道什么时候取哪些值为最大值,尤其是删操作时,回滚莫队就是只用加操作实现的。我们对询问左端点所在的块排序,相同的话按照右排序,这样对于相同的左......
  • P10398 题解
    blog。博弈论。考虑使用AGC002E的方法分析:将\(a_i\)升序排列,然后画成下图状物。一次操作相当于消掉最下面的一行/最左边的一列,消完的人胜利。将这个问题转换为:你在左下角,每次可以往上面(上面是空的就走到右上)/右边走一步,谁先走到最后一列就赢了。于是可以写出\(O(\su......
  • [题解]CF1775E The Human Equation
    来个另类解。思路手玩一下样例,发现减法只会用在正数上,加法只会用在负数上,大概是因为如何在负数上用了减法或在正数上用了加法,都需要额外的次数去消掉。然后注意到在两个正数中间包这的所有负数可以直接缩成一个数,两个负数中间包着的所有正数也可以直接缩成一个数。那么现在的序......
  • FZOUTSY 题解
    题意简述给定一个长度为\(n\)的,由特定\(7\)种字符构成的字符串,有\(m\)次询问,每次询问需要求出编号在\([l,r]\)内的后缀中,有多少对后缀的最长公共前缀长度大于等于\(k\)。题目分析注意到在所有询问中,\(k\)的值是一样的,所以我们可以考虑求出给定字符串中以第\(i\)个......
  • [题解]P8867 [NOIP2022] 建造军营
    P8867[NOIP2022]建造军营只有B国袭破坏的道路是无向图的割边时,这张图才会变得不连通,所以我们进行边双缩点,最终形成一棵树,不妨令根节点为\(1\)。记\(E[u]\)为缩点后的\(u\)包含多少条原图上的边,\(V[u]\)为\(u\)包含多少个原图上的点,并定义\(s[u]\)表示子树\(u\)中的边数。那么......
  • 龙芯3A4000的linux系统下node14.17.5运行出现Floating point exception(浮点数异常)问
    因项目需要在龙芯下使用node14.17.5执行构建任务,在使用源码编译安装后,执行时出现Floatingpointexception(浮点数异常)问题。经调试发现,其是在使用openssl加载ECC相关证书时使用mips64汇编代码时导致的。在分析相关代码后,将deps下的openssl中的bn_div.c文件的16行进行修改,重新......
  • 2023ICPC 亚洲区域赛南京站 The 2nd Universal Cup 题解 更新至 7 题
    2023ICPC亚洲区域赛南京站The2ndUniversalCup题解更新至7题Preface住院了,在医院闲得无聊自己V了一场。这场复习赛,貌似半年前还是一年前打过一次,只过了4个题。今日来还愿了。但有些题还是不会做,真的唐。我会在代码一些有必要的地方加上注释,签到题可能一般就不会写了.......
  • python问题解决-外部模块明明安装了,却总是无法找到
    1现象代码中引入了cv2模块,这是一个图像识别模块。但运行时总提示找不到该模块。也按照要求安装了opencv-python等模块。还有其它的,如python-pptx模块,提示如下:Traceback(mostrecentcalllast):File"E:/python/wps/ppt_pic.py",line1,in<module>frompp......
  • [题解]P3629 [APIO2010] 巡逻
    P3629[APIO2010]巡逻\(k=1\)时,我们一定贪心选择直径\(d\)的两个端点建立道路,所以答案是\(2\times(n-1)-d+1\)。\(k=2\)时,两条新建的道路恰好形成\(2\)个环,我们通过手玩可以发现一个结论:\(1\)条边恰好被经过\(1\)次,当且仅当它恰好位于\(1\)个环上。\(1\)条边恰好被经过\(2\)......