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\)根木棍,希望用它们拼成三角形,可以将其中的某些木棍增长, ...
随机推荐
- 明明白白你的Linux服务器——日志篇
日志对于安全来说,非常重要,它记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹.日志主要的功能有:审计和监测.他还可以实时的监测系统状态,监测和追踪 ...
- 使用BulkCopy报错 从 bcp 客户端收到一个对 colid 19 无效的列长度
====System.Data.SqlClient.SqlException: 从 bcp 客户端收到一个对 colid 19 无效的列长度. 从0开始数,数据库上表的第19列
- swift - 添加定时器
mport UIKit /// 控制定时器的类 class ZDTimerTool: NSObject { /// 定时器 // private var timer: Timer? /// GCD定时 ...
- linux命令学习之:cp
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一. 如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文 ...
- Swift 常量、变量、条件判断
- 常量用 let ,变量用 var - // Optional为可选项,// 可用类型值 + ? 代替 let x: Optional = 10 let y: Int? = 5 print(x! + ...
- [z]一分钟教你知道乐观锁和悲观锁的区别
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...
- sql:inner join,left join,right join,full join用法及区别
join的语法: select [字段] from [表名1] inner/left/right/full join [表名2] on [表名1.字段1] <关系运算符> [表名2.字段2 ...
- get(0).tagName获得作用标签
<script type="text/javascript" src="jquery1.4.js"></script><scrip ...
- oracle主键修改&设置某一字段可以为null
1.oracle主键修改 1.1)首先查看需要修改的表的主键名,默认的情况下,数据库会自动分配 select * from user_cons_columns where table_name='表名 ...
- IOS 将图片转换为圆角图
UIImage+wiRoundedRectImage.h #import <UIKit/UIKit.h> @interface UIImage (wiRoundedRectImage) + ...