以前的一道题目,现在拿到总觉得是DFS,然后T掉就没什么想法了,很狗的看了以前的写法(以前还是看题解的AC的),是BFS,每次都要转弯,但是之前你的达到一种他走到了死路,所以才是不得不转弯,写法也是非常棒,预处理的转弯数是-1就可以达到一开始转弯的+1抵消。

DFS写法:

中间判断两个条件,如果是起点,不是起点,然后剪枝的话,就是有flag直接return,还有那个点不行也return,主要是转弯数不行或者点不是都要return。

#include<iostream>
#include<cstdio>
#include<math.h>
#include<queue>
#include<map>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define PI acos(-1.0) const int N=1e2+10; bool vis[N][N];
int n,m;
char ma[N][N];
int sx,sy;
int ex,ey;
int k; int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
int flag; struct asd{
int x,y;
int num;
}; bool JUDGE(int x,int y)
{
if(x<=0||y<=0||x>n||y>m||ma[x][y]=='*')
return 0;
return 1;
}
queue<asd>q; void BFS()
{
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis)); if(sx==ex&&sy==ey){
flag=1;
return;
} asd now,ne;
now.x=sx;now.y=sy;
now.num=-1;
vis[now.x][now.y]=1;
q.push(now); while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
ne.x=dx[i]+now.x;
ne.y=dy[i]+now.y; //因为之前肯定是不能再走下去了,所以必须转弯。
while(JUDGE(ne.x,ne.y)){ //然后一直在这个方向走走,走到不能走为止。
if(!vis[ne.x][ne.y]){
ne.num=now.num+1;
vis[ne.x][ne.y]=1;
if(ne.x==ex&&ne.y==ey&&ne.num<=k){
flag=1;
return;
}
q.push(ne);
}
ne.x+=dx[i];
ne.y+=dy[i];
}
}
}
} int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",ma[i]+1);
scanf("%d",&k);
scanf("%d%d%d%d",&sy,&sx,&ey,&ex);
flag=0;
BFS();
if(flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}

DFS写法

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PI;
typedef pair< PI, int> PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N=110; char ma[N][N];
int vis[N][N];
int n,m,num;
int sx,sy,tx,ty,flag;
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0}; void dfs(int x,int y,int d)
{
int i;
if(vis[x][y]>num)
return;
if(vis[x][y]==num&&(x!=tx&&y!=ty))
return;
if(flag)
return; if(x==tx&&y==ty){
if(vis[x][y]<=num)
flag=1;
return;
}
for(i=0;i<4;i++){
int xx=dx[i]+x;
int yy=dy[i]+y;
if(xx<0||yy<0||xx>=n||yy>=m||ma[xx][yy]=='*'||vis[xx][yy]<vis[x][y])
continue;
if(d!=-1&&i!=d&&vis[xx][yy]<vis[x][y]+1)
continue;
vis[xx][yy]=vis[x][y];
if(d!=-1&&i!=d){
vis[xx][yy]++;
}
dfs(xx,yy,i);
}
}
int main()
{
int T,i;
cin>>T;
while(T--){
scanf("%d%d",&n,&m);
for(i=0;i<n;i++){
scanf("%s",ma[i]);
}
scanf("%d%d%d%d%d",&num,&sy,&sx,&ty,&tx);
sy--;sx--;tx--;ty--;
flag=0;
memset(vis,1,sizeof(vis));
vis[sx][sy]=0;
dfs(sx,sy,-1);
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}

hdoj1728【搜索的两种写法】的更多相关文章

  1. Python 自定义元类的两种写法

    有关元类是什么大家自己搜索了解,我这里写一下实现元类的两种写法 # 自定义元类 #继承type class LowercaseMeta(type): ''' 修改类的属性名称为小写的元类 ''' # ...

  2. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  3. EF架构~linq模拟left join的两种写法,性能差之千里!

    回到目录 对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行j ...

  4. 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。

    比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...

  5. 快速排序partition过程常见的两种写法+快速排序非递归实现

    这里不详细说明快速排序的原理,具体可参考here 快速排序主要是partition的过程,partition最常用有以下两种写法 第一种: int mypartition(vector<int& ...

  6. java 路径分隔符File.separator 以及 路径两种写法"/"和"\\"

    一.File.separator File file=new File(); 这句是新建一个文件.file.separator这个代表系统目录中的间隔符,说白了就是斜线,不过有时候需要双线,有时候是单 ...

  7. iOS中表视图单元格事件用nib和storyboard的两种写法总结

    从ios6开始,苹果公司推出了storyborad技术取代了nib的写法,这样代码量确实少写了很多,也比较简洁.但是,从学习的角度来说,阿堂认为 用nib的写法,虽然多了些代码,但是对于掌握知识和原理 ...

  8. linq和ef关于group by取最大值的两种写法

    LINQ: var temp = from p in db.jj_Credentials group p by p.ProfessionID into g select new { g.Key, Ma ...

  9. ThinkPHP中Widget的两种写法及调用

    Widget扩展一般用于页面组件的扩展,在页面根据需要输出不同的内容,下面介绍一下ThinkPHP中Widget的两种写法及调用 写法一: ArticlWidget.class.php文件: clas ...

随机推荐

  1. 重装系统(Win)

    有朋友问我,重装系统该怎样操作呢? 1. 硬盘重装 官网:http://www.heiyunwang.com/ ,点击下载软件:http://dlsw.baidu.com/sw-search-sp/s ...

  2. 【转载】WebService相关概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  3. ConcurrentHashMap源代码解析

    这些天一直在看集合相关的源代码.确实学到了不少东西.这些集合都是息息相关的,学了就停不下来! 学集合就必须要学习锁的知识.学了锁那么并发编程的知识也不能少,都是非常重要的基础知识. jdk1.8的源代 ...

  4. 关于使用openfiler作为共享存储来安装rac时的问题

    关于使用openfiler作为共享存储来安装rac时的问题 第一:一定要使用openfiler-2.3-x86-disc1.iso这个版本号的openfiler,不要使用其它版本号的openfiler ...

  5. iOS xmpp协议实现聊天之openfire的服务端配置(一)

    今天弄这个openfire服务端的配置直接苦了一逼,只是好在最后最终配置好了.首先感谢@月光的尽头的博客给了我莫大的帮助. 切入正题,首先说一下iOS xmpp协议实现聊天openfireserver ...

  6. Android Baseline小tip

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/40709353 Baseline Alignment

  7. org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed to send event

    org.apache.flume.EventDeliveryException: NettyAvroRpcClient { host: hadoop1, port: 41414 }: Failed t ...

  8. HDFS vs. MongoDB

    HDFS MongoDB 共同点 http://www.mongoing.com/wp-content/uploads/2016/08/MDBSH2016/TJ_MongoDB+Spark.pdf 横 ...

  9. Axure Base 08 动态面板的用途

    写了几个Axure教程之后发现,可能教程的起点有些高了,过分的去讲效果的实现,而忽略了axure功能以及基础元件的使用,那么从这个教程开始,把这些逐渐的展开讲解. 关于动态面板 动态面板是axure原 ...

  10. 主线程 view

    参考https://blog.csdn.net/u011001142/article/details/50912358