Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175

因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS。

因为与Hdu 1728相比,都要考虑转弯次数,所以在判断转弯的次数上,两者可以相互借鉴。

这一点应该不难想到,在搜索前就应判断两点的值是否相等,以及两点的值中是否有0。如果不相等或其中一值为0,则可以判断是"NO"。

时间虽是10000ms,但只是这样,还是超时。

后来又加了一个数组walk[][],用于记录走到这一点的最小转弯数。当第二次走到这点时,如果第二次的转弯数小于或等于之前的转弯数,则更新数组;否则,不再继续往这个方向走。加上这个数组,再时间上就算初步优化了。

之后又在网上看了看其他人的题解,发现还可以加上这两点:

1.判断回头,即在某个点选择方向时,不往回走。

2.走在一点时,如果此时转弯数为2,那么就要考虑此时与终点是否在同一行或在同一列。如果不在同一列或同一行,则势必要再转一次弯,那就超过2次了。因此当转弯数为2时,两点在同一列或同一行时才能继续往这方向走。

这两点起到了很大的作用,可以大大优化运行时间。

#include <iostream>
#include <cstring>
#include <cstdio> using namespace std; const int MAXN = 1000 + 2;
int map[MAXN][MAXN];
int walk[MAXN][MAXN];
int dir[4][2] = { 1,0, -1,0, 0,1, 0,-1 };
int opposite[4] = { 1,0,3,2 }; // 与i方向相反的值为opposite[i]
int n,m;
bool flag; // 最终能否搜到的标志
int x1,y1,x2,y2; void Dfs( const int x,const int y,const int from,const int step ); void Quick_judge(){ // 初次快速判断能否走到
int i;
int x,y;
if( map[x1][y1]!=map[x2][y2] ){
flag = false;
return ;
}
if( map[x1][y1]==0 || map[x2][y2]==0 ){
flag = false;
return ;
}
for( i=0;i<4;i++ ){
x = x1 + dir[i][0];
y = y1 + dir[i][1];
if( x==x2 && y==y2 ){ //此时已在终点
flag = true;
return ;
}
Dfs( x,y,i,0 ); //开始搜索
}
} void Dfs( const int x,const int y,const int from,const int step ){
if( flag )
return ;
if( x==x2 && y==y2 && step<=2 ) //到达终点
flag = true;
if( map[x][y] ) //非0,无法继续走
return ;
if( walk[x][y]==-1 || step<=walk[x][y] ) //与走到该点的最小转弯数比较
walk[x][y]=step;
else
return ;
if( step==2 ) //如果步数为2,则判断是否在同一行或同一列
if( x!=x2 && y!=y2 )
return ;
int i;
int nextX,nextY;
int nextStep;
for( i=0;i<4;i++ ){
if( i==opposite[from] ) //避免往回走
continue;
nextX = x+dir[i][0];
nextY = y+dir[i][1];
nextStep = step;
if( i!=from ) //转弯
nextStep++;
if( nextX>0 && nextX<=n && nextY>0 && nextY<=m && nextStep<=2 )
Dfs( nextX,nextY,i,nextStep );
}
return ;
} int main()
{
int i,j;
int C;
while( scanf("%d%d",&n,&m)!=EOF && (n||m) ){
for( i=1;i<=n;i++ )
for( j=1;j<=m;j++ )
scanf("%d",&map[i][j]);
scanf("%d",&C);
while(C--){
flag = false;
memset( walk,-1,sizeof(walk) ); //flag与walk[][]的初始化
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
Quick_judge();
if( flag )
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}

Hdu 1175 连连看(DFS)的更多相关文章

  1. hdu 1175 连连看 DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...

  2. HDU 1175 连连看 (DFS+剪枝)

    <题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...

  3. HDU 1175 连连看(超级经典的bfs之一)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  4. hdu 1175(BFS&DFS) 连连看

    题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...

  5. HDU - 1175 连连看 【DFS】【BFS】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...

  6. hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...

  7. hdu 1175 连连看 (深搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...

  8. HDU 1175 连连看 (深搜+剪枝)

    题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...

  9. hdu 1175 连连看 DFS_字节跳动笔试原题

    转载至:https://www.cnblogs.com/LQBZ/p/4253962.html Problem Description "连连看"相信很多人都玩过.没玩过也没关系, ...

随机推荐

  1. 挺有意思的Blog

    http://blog.csdn.net/dawanganban/article/details/19925449 http://www.syslog.org/ https://baoz.net/li ...

  2. 导入jsp

    <%@ page contentType="text/html;charset=UTF-8" %><%@ page isELIgnored="false ...

  3. Pascal向C++的跨越

    最近从pas转向了C++,觉得需要在语言上总结对比一下,以及记录一些注意点,关于STL,还需要之后好好地学习.同时,希望这篇文章对从pas转C++的同学有所帮助. 基本类型 首先是基本类型的比较: P ...

  4. HDOJ 1253 胜利大逃亡(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 思路分析:因为问题需要寻找到达终点的最短的距离(最短的步数),即在状态转换图上需要找出层次最浅的 ...

  5. JAVA面试中的几个重要基础问题

    1.java是否会出现内存溢出?如何解决? 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存.为了解决Java中内存溢出问题,我们首先必 ...

  6. Node.mongoose

    简介 mongodb是一款面向文档的数据库,不是关系型数据库,新手熟悉mysql.sqlserver等数据库的人可能入手稍微困难些,需要转换一下思想,可以不需要有固定的存储模式,以文档模型为存储内容相 ...

  7. How to Programmatically Add/Delete Custom Options in Magento? - See more at: http://apptha.com/blog/

    In this tutorial, I would like to help out Magento developers and clients with how to programmatical ...

  8. 信号量多-threaded同步Semaphore

    Semaphore它是JDK1.5一个实现后,外面有个办法同步.Semaphore能够保持其当前的线程接入号码.并提供了一个同步机制. 采用Semaphore时,可以用相同的对资源的访问进行控制的线程 ...

  9. jQuery对DOM的操作

    "jQuery中非常重要的部分,就是对DOM的操作!" "jQuery中非常重要的部分,就是对DOM的操作!" "jQuery中非常重要的部分,就是对 ...

  10. ecplise启动tomcat异常

    由于myeclipse为正常关闭,导致下次启动时抛出异常:类似于无法加载异常缓存的内容之类... 处理办法: 1.关闭myeclipse 2.找到工作空间/.metadata/.plugins/ 3. ...