https://codeforces.com/contest/1064/problem/D

题意

给你一个有障碍的图,限制你向左向右走的次数,问你可以到达格子的个数

思路

  • 可以定义状态为vi[x][y][l][r],状态唯一,理论上可以bfs或者dfs都可以搜出唯一结果,但是时间空间复杂度都不允许
  • 进而要不改变状态定义或者找找规律或者思考贪心(调整访问顺序)在做这道题之前并不知道便利顺序对于搜索有这么大的影响
  • 我尝试了重新定义状态为vi[x][y][dir],但是用了dfs还是wa
  • 根本问题是,先访问(标记)的点后面就不能访问了,可以定义多一维状态或者按照某种顺序访问点,因此贪心原则是:同样能到达一个点,但是剩下向左向右次数越多,就能走得更远,因此优先访问上下的点,在访问左右的点。

关于搜索

搜索现阶段来说已经不再是套板子了,而是需要根据实际用途进行调整

  1. dfs or bfs

    • dfs走到没有路为止,在这道题里面返回边界是四周都不能走or左右步数用完,能够反悔
    • bfs走一步向四周拓展一步,访问一个状态有先后顺序,并不能反悔
    • 在这道题中,因为优先走上下,然后走左右,dfs需要便利本层所有方向才返回,所以并不能满足先走上下,再走左右。bfs可以实现。
  2. bfs用什么容器
    • 根据实际情况,本题需要先访问上下的点,再访问左右的点,因此这题可以用一个双端队列,上下走的放在队头,左右走的放在队尾,每次取队首元素
  3. 遍历的顺序
  4. 标记下一个点 or 标记当前访问的点
    • bfs一定要标记下一个点,防止重复入队
    • dfs标记下一个点,可以抹掉(用于反悔)。标记当前点不可以抹掉
  5. 标记的状态是否唯一
#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(重识搜索)的更多相关文章

  1. 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 ...

  2. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)

    题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...

  3. [Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) ](A~E)

    A: 题目大意:给你$a,b,c$三条边,可以给任意的边加任意的长度,求最少共加多少长度使得可以构成三角形 题解:排个序,若可以组成,输出$0$,否则输出$c-a-b+1(设a\leqslant b\ ...

  4. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins

    http://codeforces.com/contest/876/problem/D 题意: 最开始有一串全部由"O"组成的字符串,现在给出n个数字,指的是每次把位置n上的&qu ...

  5. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) C. Classroom Watch

    http://codeforces.com/contest/876/problem/C 题意: 现在有一个数n,它是由一个数x加上x每一位的数字得到的,现在给出n,要求找出符合条件的每一个x. 思路: ...

  6. 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. 思路: 差能 ...

  7. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal

    http://codeforces.com/contest/876/problem/A 题意: 一个人一天要吃n次蜂蜜,他有3个朋友,他第一次总是在一个固定的朋友家吃蜂蜜,如果说没有吃到n次,那么他就 ...

  8. 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, ...

  9. CF Round #516 (Div. 2, by Moscow Team Olympiad)

    前言:依旧菜,\(A\)了\(4\)题,不过这次上蓝了挺开心的. A. Make a triangle! Description 给出\(3\)根木棍,希望用它们拼成三角形,可以将其中的某些木棍增长, ...

随机推荐

  1. struct在C和C++中的使用总结

    主要理解一下两点: 1.在C和C++中struct的常规使用. 2.在C++中struct和class基本一致,除了在访问控制权限方面,即: 通过struct关键字实现的类,属性,函数默认的访问权限为 ...

  2. 客户端无法重新使用 SPID 为 63 的会话,该会话已被重置用于连接

    客户端无法重新使用 SPID 为 %d 的会话,该会话已被重置用于连接池.失败 ID 为 %d. 此错误可能是由于先前的操作失败引起的.请查看错误日志,找出在显示此错误消息之前刚发生的失败操作. 20 ...

  3. linux命令学习之:sort

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出.sort命令既可以从特定的文件,也可以从stdin中获取输入. 语法 sort  (选项)  (参数) 选项 sort将文 ...

  4. jquery写tab切换,三行代码搞定

    <script type="text/javascript"> $("button").on("click",function( ...

  5. android和js互相调用

    import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.o ...

  6. Python使用filetype精确判断文件类型 (文件类型获取)

    filetype.py Small and dependency free Python package to infer file type and MIME type checking the m ...

  7. 故障处理分析:华为5885v3 cable/ Interconnect (LEFT Panel)

    故障现象: 处理结果: 1.重新把插左前面板,重启,故障消失.

  8. web服务器 双网卡 路由 设置

    最近在装服务器的时候,遇到一个问题,就是这个服务器本身是一个web服务器,但它上面装有一个局域网数据交换软件,还需要访局域网. 但软件装上去了,局域网怎么也不能访问,后来了解到是因为双网卡的原因,需要 ...

  9. PAT 1038 统计同成绩学生(20)(代码)

    1038 统计同成绩学生(20)(20 分) 本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第1行给出不超过10^5^的正整数N,即学生总人数.随后1行给出N名学生 ...

  10. andorid 多线程handler用法

    .xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...