codeforces 793B - Igor and his way to work(dfs、bfs)
题目链接:http://codeforces.com/problemset/problem/793/B
题目大意:告诉你起点和终点,要求你在只能转弯两次的情况下能不能到达终点。能就输出“YES”,不能就输出“NO”。
解题思路:这算是经典的转弯题了,接近半年没写搜索题了,,所以今天先拿这道题开刀吧。这个题关键就是“判重”,如何记录走过的点。我们可以开个三维数组,记录各个坐标各个方向上的转弯数,如果下次在到这个点这个方向,那就比较转弯数,如果这次转弯数大于等于已经记录的转弯数那就不用再找下去了,因为这次能走到的地方,上次肯定也能走到。估计一下时间复杂度大概为O(4*3n)。
dfs:
- #include<iostream>
- #include<cstring>
- using namespace std;
- const int N=1e3+;
- int m,n;
- bool flag=false;
- char map[N][N];
- int vis[N][N][];//*关键*用来标记走过的点,记录该点朝着各方向转弯数
- int d[][]={{,},{-,},{,},{,-}};
- void dfs(int x,int y,int dir,int cnt){
- if(x<=||x>m||y<=||y>n||cnt>)
- return;
- if(vis[x][y][dir]<=cnt)//如果这个位置这个方向已经走过,且用了更小的转弯数,那就不用再走这个点了
- return;
- if(map[x][y]=='T'){
- flag=true;
- return;
- }
- if(map[x][y]!='.'&&map[x][y]!='S')
- return;
- vis[x][y][dir]=cnt;
- for(int i=;i<;i++) {
- int x1=x+d[i][];
- int y1=y+d[i][];
- if(dir==-)
- dfs(x1,y1,i,cnt);
- else if(dir!=i)
- dfs(x1,y1,i,cnt+);
- else
- dfs(x1,y1,i,cnt);
- }
- }
- int main(){
- int index,indey;
- scanf("%d %d",&m,&n);
- getchar();
- for(int i=;i<=m;i++){
- for(int j=;j<=n;j++){
- scanf("%c",&map[i][j]);
- if(map[i][j]=='S'){
- index=i;
- indey=j;
- }
- }
- getchar();
- }
- memset(vis,0x3f,sizeof(vis));//转弯数初始化为无限大
- dfs(index,indey,-,);//-1表示开始位置没有方向
- if(flag)
- printf("YES\n");
- else
- printf("NO\n");
- }
bfs,跟上面差不多的:
- #include<iostream>
- #include<cstring>
- #include<queue>
- using namespace std;
- const int N=1e3+;
- int vis[N][N][];
- int d[][]={{,},{-,},{,},{,-}};
- char map[N][N];
- int m,n;
- bool flag=false;
- struct node{
- int x,y,dir,cnt;
- }now,t,pre;
- //int num=0;
- void bfs(int stax,int stay){
- queue<node>q;
- t.x=stax;
- t.y=stay;
- t.dir=-;
- t.cnt=;
- q.push(t);
- while(!q.empty()){
- pre=q.front();
- q.pop();
- for(int i=;i<;i++){
- int x=pre.x+d[i][];
- int y=pre.y+d[i][];
- int cnt;
- if(pre.dir==-)//判断一下上次方向和当前要走的方向的关系
- cnt=;
- else if(pre.dir==i)
- cnt=pre.cnt;
- else if(pre.dir!=i)
- cnt=pre.cnt+;
- if(x<=||x>m||y<=||y>n||cnt>)
- continue;
- if(map[x][y]=='T'){//到达终点
- flag=true;
- return;
- }
- if(map[x][y]!='S'&&map[x][y]!='.')
- continue;
- if(vis[x][y][i]<=cnt)//这个点这个方向已经有更优方案了
- continue;
- vis[x][y][i]=cnt;
- now.x=x;
- now.y=y;
- now.dir=i;
- now.cnt=cnt;
- // num++;
- // printf("%d\n",num);
- q.push(now);
- }
- }
- }
- int main(){
- int index,indey;
- scanf("%d %d",&m,&n);
- getchar();
- for(int i=;i<=m;i++){
- for(int j=;j<=n;j++){
- scanf("%c",&map[i][j]);
- if(map[i][j]=='S'){
- index=i;
- indey=j;
- }
- }
- getchar();
- }
- memset(vis,0x3f,sizeof(vis));
- bfs(index,indey);
- if(flag)
- printf("YES\n");
- else
- printf("NO\n");
- }
codeforces 793B - Igor and his way to work(dfs、bfs)的更多相关文章
- codeforces 793B. Igor and his way to work
B. Igor and his way to work time limit per test 3 seconds memory limit per test 256 megabytes input ...
- Codeforces Beta Round #94 div 2 C Statues dfs或者bfs
C. Statues time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)
题目链接:Travelling Salesman and Special Numbers 题意: 给了一个n×m的图,图里面有'N','I','M','A'四种字符.问图中能构成NIMA这种序列最大个 ...
- codeforces793 B. Igor and his way to work (dfs)
题目链接:codeforces793 B. Igor and his way to work (dfs) 求从起点到终点转方向不超过两次是否有解,,好水啊,感觉自己代码好搓.. #include< ...
- 【codeforces 793B】Igor and his way to work
[题目链接]:http://codeforces.com/contest/793/problem/B [题意] 给一个n*m大小的方格; 有一些方格可以走,一些不能走; 然后问你从起点到终点,能不能在 ...
- codeforces 598D Igor In the Museum
题目链接:http://codeforces.com/problemset/problem/598/D 题目分类:dfs 题目分析:处理的时候一次处理一片而不是一个,不然会超时 代码: #includ ...
- Codeforces 747F Igor and Interesting Numbers DP 组合数
题意:给你一个数n和t,问字母出现次数不超过t,第n小的16进制数是多少. 思路:容易联想到数位DP, 然而并不是...我们需要知道有多少位,在知道有多少位之后,用试填法找出答案.我们设dp[i][j ...
- Codeforces Round #407 (Div. 1) B. Weird journey —— dfs + 图
题目链接:http://codeforces.com/problemset/problem/788/B B. Weird journey time limit per test 2 seconds m ...
- Codeforces Round #306 (Div. 2) B. Preparing Olympiad dfs
B. Preparing Olympiad Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/550 ...
随机推荐
- 【JVM.2】垃圾收集器与内存分配策略
垃圾收集器需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 在前一节中介绍了java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈 ...
- item 2: 理解auto类型的推导
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你已经读过item 1的模板类型推导,你已经知道大部分关于au ...
- 【下一代核心技术DevOps】:(三)私有代码库阿里云Git使用
1. 引言 使用DevOps肯定离不开和代码的集成.所以要想跑通整套流程,代码库的选型也是非常重要的.否则无法实现持续集成.目前比较常用的代码管理有SVN和GIt 如果还使用SVN的,建议尽早迁移到G ...
- C语言----数据类型(基础篇一)
C语言的入门程序模板 #include <stdio.h> /*使用或者包含系统里面的程序*/ main() /*程序入口点*/ { /*起点*/ +; /*叫计算机执行的指令*/ } / ...
- eclipse添加maven环境
一.打开eclipse,选择Window->preference,如下图所示 二.Maven-> installation->add,见下图: 三.选择Directory,选择mav ...
- bash处理一条命令的步骤
Shell执行一条命令步骤 参考链接: <Learning the bash Shell, 3rd Edition -- 7.3. Command-Line Processing> &l ...
- 第二个spring
由于第一个spring已经完成,我们现在进去第二个spring! 陈志棚:成绩的统筹 李天麟:界面音乐 徐侃:代码算法 plan好布局,分配任务,控制时间!
- HDOJ2010_水仙花数
一道水题.一直出现Output Limit Exceeded的原因是在while循环中没有终止条件的时候会自动判断并报错,写的时候忘记加!=EOF结束标识了. HDOJ2010_水仙花数 #inclu ...
- octave基本指令5
octave基本指令5 控制语句 for >> v=zreos(5,1) v = 0 0 0 0 0 >> for i=1:10, > v(i) = 2^i; > ...
- Aspose for Maven 使用
https://blog.aspose.com/2014/08/12/aspose-for-maven-aspose-cloud-maven-repository/ https://marketpla ...