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\)根木棍,希望用它们拼成三角形,可以将其中的某些木棍增长, ...
随机推荐
- Codeforces Beta Round #18 (Div. 2 Only)
Codeforces Beta Round #18 (Div. 2 Only) http://codeforces.com/contest/18 A 暴力 #include<bits/stdc+ ...
- 删除sslvpn用户
config user localedit xinghen unset two-factornextend config user groupedit vpngroup unselect member ...
- ALV界面显示
PERFORM ADD. IS_LAYOUT_LVC-CWIDTH_OPT = 'X'. IS_LAYOUT_LVC-SEL_MODE = 'A'. CALL FUNCTION 'REUSE_ ...
- stark组件开发之列表页面预留钩子方法。 可根据用户的不同,显示不同的列
要实现,这个方法.子类中 list_diplay 这个列表, 就不能够写死.他应该是 可以根据.用户的不同,返回不同的值. 所以 就需要一个函数, 可以进行判断当前用户是谁. 并且往这个列表中添加,他 ...
- 10.17JS日记
1.变量提升 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域,叫window, window分为两个模块,一个叫做内存模块,一个叫做运行模块,内存模块找到当前作用域下的 ...
- 数据库以及pymysql
1.pymysql模块操作数据库详细 import pymysql # user = 'chun' # psw = conn = pymysql.connect(host='localhost',us ...
- Android开发之动态设置字体的样式和粗细
字体设置通常有两种形式: 1:在xml中直接设置 android:textStyle="bold" android:typeface="sans" 2:用jav ...
- thread库,附带程序介绍
千万注意线程不要比主线程晚结束,主线程一旦结束,对象将被销毁 std:thread 代表了一个线程对象 this_thread:是一个命名空间,对当前调用者线程进行操作 如果把可调用对象作为参数传递给 ...
- static ,const
函数原型作用域:作用范围为函数形参表范围,起始于“(”,结束于“)”,这是声明 定义是属于局部作用域,所以声明的时候不写形参名字也可以 类作用域:包含类体及在类外实现的本类成员函数的函数体 静态生存期 ...
- Hibbernate详解一
这里先做一个简单的入门,后面有详解 记住图解原理: 这里只是没有整合spring等项目使用的hibernate的使用详解. 一.Hibernate简介 1.Hibernate在开发中所处的位置 2.O ...