题目链接

这道题被稍微改编当作过去年的期末上机题,也被直接放到了这次这一届的第二次练习赛。当初刚看到这道题时DFS并没有系统的学过,做起来极其费劲。现在学过之后开始实践练习,发现这道题真的是很水。

我的DFS函数中加入了方向,和拐弯数两个参数,作为判断。(其实是放在外面当全局变量自己控制不好的借口orz),并将vi这个数组存储为到达这个位置时最少的拐弯数,这样大于vi到达这里并且vi不是初始值-1的就直接剪枝。

 #include<cstdio>
#include<cstring>
using namespace std;
int a[][],n,m,vi[][],dir[][]={{,},{-,},{,},{,-}},ci,flag,ei,ej;
void dfs(int si,int sj,int d,int x)
{
if(si==ei&&sj==ej&&x<=)//看是否成功到达终点
{flag=;return;}
if(si<||si>=n||sj<||sj>=m||x>||(x>vi[si][sj]&&vi[si][sj]!=-)||a[si][sj]!=||flag==)//几个预先判断
return;
else
{
a[si][sj]=;
vi[si][sj]=x;//注意将vi存储为到这个位置所经历的拐弯数
for(int i=;i<;i++)
{
if(i==d)dfs(si+dir[i][],sj+dir[i][],i,x);//有两种情况,继续沿着之前的方向前进的话拐弯数不变,不然就+1
else
dfs(si+dir[i][],sj+dir[i][],i,x+);
}
a[si][sj]=;
}
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n==&&m==)
break;
int i,j,si,sj;
for(i=;i<n;i++)
for(j=;j<m;j++)
scanf("%d",&a[i][j]);
scanf("%d",&ci);
while(ci--)
{
memset(vi,-,sizeof(vi));//将数组初始化为-1这个之后不可能取到的值有助于判断
scanf("%d%d%d%d",&si,&sj,&ei,&ej);
si--;
sj--;
ei--;
ej--;
flag=;
if(a[si][sj]!=a[ei][ej]||(a[si][sj]==)||a[ei][ej]==)//如果是不需dfs就能判断的不成立情况就直接continue
{
printf("NO\n");
continue;
}
else
{
for(i=;i<;i++)
dfs(si+dir[i][],sj+dir[i][],i,);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
}
return ;
}

当初做起来非常困难的题目现在可以不到10分钟轻松做出来,进步的喜悦真的是难以描述。还有很多的内容需要学习与练习,继续加油!

(DFS)hdoj1175:连连看的更多相关文章

  1. HDOJ1175连连看 DFS

    连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  2. hdoj1175 连连看(dfs+剪枝)

    处理连连看问题. 要求拐弯方向不多于两次.剪枝很重要!!! 用dir记录当前方向.Orz,居然没想到. #include<iostream> #include<cstring> ...

  3. [HDOJ1175]连连看

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  4. JavaScript编写连连看

    这几天写题比较少,做了一下网页设计的期末大作业.搞了个连连看,核心代码和hdu 1175那个题目一样. 越来越觉得学ACM是十分有用的,软件的核心是数据结构和算法,学会了DFS,连连看就水到渠成了. ...

  5. 连连看游戏(dfs)【华为上机题目】

    1 连连看游戏 今天同学给我做了道编程题目,貌似是华为的,题目描述大概是这样的: 给定一个连连看棋盘,棋盘上每个点都有各种图案(用非0数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否 ...

  6. HDU1175 连连看(DFS)

    Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经 ...

  7. 连连看(dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

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

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

  9. hdu1175连连看(dfs+细节)

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. svn提交代码的原则

    [1]先更新在提交 [2]多提交 [3]不要提交不能通过编译的代码 [4]每次提交必须书写明晰的标注 [5]提交时注意不要提交本地自动生成的文件 [6]不要提交自己不明白的代码 [7]慎用锁定功能

  2. 在Spark上用Scala实验梯度下降算法

    首先参考的是这篇文章:http://blog.csdn.net/sadfasdgaaaasdfa/article/details/45970185 但是其中的函数太老了.所以要改.另外出发点是我自己的 ...

  3. Delphi 过程与函数

    注:该内容整理自以下链接. http://chanlei001.blog.163.com/blog/static/340306642011111615445266/ delphi 过程以保留字proc ...

  4. Android ViewFlipper的使用分析

    [ViewFlipper]——基础 1.ViewPager 和ViewFliping的区别: 最显著的区别就是ViewPager在滑动的时候内部的View默认就能够跟随手指滑动,而 ViewFlipi ...

  5. 工作流学习——Activiti整体认识二步曲 (zhuan)

    http://blog.csdn.net/zwk626542417/article/details/46594505 ***************************************** ...

  6. form作为module name 悲剧了

    爆出很无语的错误,也怪我,没有实地的debug. 所以,module name应该是不能碰关键词类似,最好custom一点好.

  7. linux 重命名文件和文件夹

    linux下重命名文件或文件夹的命令mv既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式 ...

  8. MHA的几种死法-叶良辰

    master不通      找到最新slave           找到有所有其他slave缺失relay log的 slave      选主           配置文件指定           ...

  9. 中医与DBA

    很多药方,只要吃不死,总有一款适合你.哈哈.我要做西医,先检查身体,再了解每种药的作用,做到对症下药.

  10. cssText在 IE6/7/8和chrome/Firefox/IE9+的不同

    一,结尾没有分号 <div style="font-size:14px;">test</div> <script type="text/ja ...