Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth(重识搜索)
https://codeforces.com/contest/1064/problem/D
题意
给你一个有障碍的图,限制你向左向右走的次数,问你可以到达格子的个数
思路
- 可以定义状态为vi[x][y][l][r],状态唯一,理论上可以bfs或者dfs都可以搜出唯一结果,但是时间空间复杂度都不允许
- 进而要不改变状态定义或者找找规律或者思考贪心(调整访问顺序)在做这道题之前并不知道便利顺序对于搜索有这么大的影响
- 我尝试了重新定义状态为vi[x][y][dir],但是用了dfs还是wa
- 根本问题是,先访问(标记)的点后面就不能访问了,可以定义多一维状态或者按照某种顺序访问点,因此贪心原则是:同样能到达一个点,但是剩下向左向右次数越多,就能走得更远,因此优先访问上下的点,在访问左右的点。
关于搜索
搜索现阶段来说已经不再是套板子了,而是需要根据实际用途进行调整
- dfs or bfs
- dfs走到没有路为止,在这道题里面返回边界是四周都不能走or左右步数用完,能够反悔
- bfs走一步向四周拓展一步,访问一个状态有先后顺序,并不能反悔
- 在这道题中,因为优先走上下,然后走左右,dfs需要便利本层所有方向才返回,所以并不能满足先走上下,再走左右。bfs可以实现。
- bfs用什么容器
- 根据实际情况,本题需要先访问上下的点,再访问左右的点,因此这题可以用一个双端队列,上下走的放在队头,左右走的放在队尾,每次取队首元素
- 遍历的顺序
- 标记下一个点 or 标记当前访问的点
- bfs一定要标记下一个点,防止重复入队
- dfs标记下一个点,可以抹掉(用于反悔)。标记当前点不可以抹掉
- 标记的状态是否唯一
#include<bits/stdc++.h>
using namespace std;
struct N{
int x,y,l,r;
};
int vi[2005][2005];
char g[2005][2005];
int n,m,stx,sty,L,R,ans,i,j;
deque<N>q;
void bfs(){
q.push_front(N{stx,sty,0,0});
ans=0;
vi[stx][sty]=1;
while(!q.empty()){
N u=q.front();q.pop_front();
int x=u.x,y=u.y,l=u.l,r=u.r;
ans++;
if(x-1>0&&!vi[x-1][y]){
q.push_front(N{x-1,y,l,r});
vi[x-1][y]=1;
}
if(x+1<=n&&!vi[x+1][y]){
q.push_front(N{x+1,y,l,r});
vi[x+1][y]=1;
}
if(y-1>0&&!vi[x][y-1]&&l<L){
q.push_back(N{x,y-1,l+1,r});
vi[x][y-1]=1;
}
if(y+1<=m&&!vi[x][y+1]&&r<R){
q.push_back(N{x,y+1,l,r+1});
vi[x][y+1]=1;
}
}
}
int main(){
cin>>n>>m>>stx>>sty>>L>>R;
for(i=1;i<=n;i++){
scanf("%s",g[i]+1);
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++)
if(g[i][j]=='*')vi[i][j]=1;
bfs();
cout<<ans;
}
Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth(重识搜索)的更多相关文章
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth
http://codeforces.com/contest/1064/problem/D 向上/向下加0,向左/右加1, step = 0,1,…… 求的是最少的步数,所以使用bfs. step=k ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...
- [Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) ](A~E)
A: 题目大意:给你$a,b,c$三条边,可以给任意的边加任意的长度,求最少共加多少长度使得可以构成三角形 题解:排个序,若可以组成,输出$0$,否则输出$c-a-b+1(设a\leqslant b\ ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins
http://codeforces.com/contest/876/problem/D 题意: 最开始有一串全部由"O"组成的字符串,现在给出n个数字,指的是每次把位置n上的&qu ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) C. Classroom Watch
http://codeforces.com/contest/876/problem/C 题意: 现在有一个数n,它是由一个数x加上x每一位的数字得到的,现在给出n,要求找出符合条件的每一个x. 思路: ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) B. Divisiblity of Differences
http://codeforces.com/contest/876/problem/B 题意: 给出n个数,要求从里面选出k个数使得这k个数中任意两个的差能够被m整除,若不能则输出no. 思路: 差能 ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal
http://codeforces.com/contest/876/problem/A 题意: 一个人一天要吃n次蜂蜜,他有3个朋友,他第一次总是在一个固定的朋友家吃蜂蜜,如果说没有吃到n次,那么他就 ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)
A. Trip For Meal 题目链接:http://codeforces.com/contest/876/problem/A 题目意思:现在三个点1,2,3,1-2的路程是a,1-3的路程是b, ...
- CF Round #516 (Div. 2, by Moscow Team Olympiad)
前言:依旧菜,\(A\)了\(4\)题,不过这次上蓝了挺开心的. A. Make a triangle! Description 给出\(3\)根木棍,希望用它们拼成三角形,可以将其中的某些木棍增长, ...
随机推荐
- EXCEL中去掉撇号的操作方法
▲数字前带撇号 选定想去掉撇号的列,然后选“数据”→“分列”在弹出的 对话框中单击“下一步” ,在“文本标识符号”处选择“'” 单击 “完成”即可
- MVC学习(四)几种分页的实现(1)
这里,我使用的是Code-First,MVC3. 我们在数据库里建一个表MyTestPages,只有一个整型字段Id. 在写一个Model类MyTestPages,代码如下 public class ...
- 5-去掉a标签下划线,禁止a标签的跳转
1.去下划线: 写样式,a{text-decoration:none; 或在a标签内联里面写style="text-decoration:none;": 2.禁用a标签跳转: a标 ...
- python 网络基础 之 网络协议
osi 七层协议 互联网协议按照功能不同分为osi七层或者tcp/ip 五层或tcp/ip 四层 tcp/ip 四层 1.应用层 2.传输层 3.网络层 4.网络接口层 tcp/ip 五层 1.应用层 ...
- scrapy 安装流程和启动
#Windows平台 1. pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pyt ...
- istio promethus收集不到数据
1.重新apply istio.yaml kubectl apply -f install/kubernetes/istio.yaml kubectl get metrics.config.istio ...
- static ,const
函数原型作用域:作用范围为函数形参表范围,起始于“(”,结束于“)”,这是声明 定义是属于局部作用域,所以声明的时候不写形参名字也可以 类作用域:包含类体及在类外实现的本类成员函数的函数体 静态生存期 ...
- RPG难题
/* 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE ...
- 探索未知种族之osg类生物---呼吸分解之事件循环三
那我们就开始处理这些事件中得到的所有的交互事件,首先我们要判断这些事件是否包含osg的退出事件,那什么情况下会触发这个退出事件呢?如果您运行过osg中example中的小例子的,聪明的你一定就会发现当 ...
- css 需要阴影的效果
box-shadow: 0 0 10px 10px #b9bcbf; CSS3 box-shadow 属性 CSS 参考手册 实例 向 div 元素添加 box-shadow: div { box-s ...