题目链接: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)的更多相关文章

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

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

  3. Codeforces 374 C. Travelling Salesman and Special Numbers (dfs、记忆化搜索)

    题目链接:Travelling Salesman and Special Numbers 题意: 给了一个n×m的图,图里面有'N','I','M','A'四种字符.问图中能构成NIMA这种序列最大个 ...

  4. codeforces793 B. Igor and his way to work (dfs)

    题目链接:codeforces793 B. Igor and his way to work (dfs) 求从起点到终点转方向不超过两次是否有解,,好水啊,感觉自己代码好搓.. #include< ...

  5. 【codeforces 793B】Igor and his way to work

    [题目链接]:http://codeforces.com/contest/793/problem/B [题意] 给一个n*m大小的方格; 有一些方格可以走,一些不能走; 然后问你从起点到终点,能不能在 ...

  6. codeforces 598D Igor In the Museum

    题目链接:http://codeforces.com/problemset/problem/598/D 题目分类:dfs 题目分析:处理的时候一次处理一片而不是一个,不然会超时 代码: #includ ...

  7. Codeforces 747F Igor and Interesting Numbers DP 组合数

    题意:给你一个数n和t,问字母出现次数不超过t,第n小的16进制数是多少. 思路:容易联想到数位DP, 然而并不是...我们需要知道有多少位,在知道有多少位之后,用试填法找出答案.我们设dp[i][j ...

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

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

随机推荐

  1. vue-cli 3.0 axios 跨域请求代理配置及生产环境 baseUrl 配置

    1. 开发环境跨域配置 在 vue.config.js 文件中: module.exports = { runtimeCompiler: true, publicPath: '/', // 设置打包文 ...

  2. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...

  3. 自己动手写把”锁”---LockSupport深入浅出

    本篇是<自己动手写把"锁">系列技术铺垫的最后一个知识点.本篇主要讲解LockSupport工具类,它用来实现线程的挂起和唤醒. LockSupport是Java6引入 ...

  4. Linux下通过受限bash创建指定权限的账号

    在日常业务运维中,有时为了配合解决问题,需要给非运维人员开通系统账号,用于查询日志或代码.通常为了系统安全或避免不必要的误操作等目的,会将账号权限降至最低.下面介绍下在Linux下通过受限bash创建 ...

  5. windows平台下编辑的内容传到linux平台出现中文乱码的解决办法

    现象说明:在windows下编辑的内容,上传到linux平台下出现中文乱码.如下: 在windows平台编写haha.txt文件,内容如下: 上传到linux平台,出现中文乱码,如下: 基本上面出现的 ...

  6. 分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口

    一.Zabbix-3.0.3批量添加主机的配置如下: 0)被监控机上要安装zabbix_agent,并配置好zabbix_agentd.conf (如下172.29.8.50是zabbix_serve ...

  7. Safecracker-HDU1015

    题意 给你大写字母的字符串,A=1,...Z=26,以及target 问你是否有v - w^2 + x^3 - y^4 + z^5 = target 有输出字典序大的那个字符串 分析 dfs code ...

  8. 【CV】ICCV2015_Learning Temporal Embeddings for Complex Video Analysis

    Learning Temporal Embeddings for Complex Video Analysis Note here: it's a review note on novel work ...

  9. Linux内核总结博客 20135332武西垚

    http://www.cnblogs.com/wuxiyao/p/5220677.htmlhttp://www.cnblogs.com/wuxiyao/p/5247571.htmlhttp://www ...

  10. Github链接及git学习心得总结

    众所周知GitHub已经是当下非常流行的代码托管库了,全世界有无数的程序员把他们的代码放在GitHub里.那比起云盘之类的工具,用GitHub有什么好处呢:1. 以后在帖子里只需要扔一个链接,大家就能 ...