(DFS)hdoj1175:连连看
这道题被稍微改编当作过去年的期末上机题,也被直接放到了这次这一届的第二次练习赛。当初刚看到这道题时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:连连看的更多相关文章
- HDOJ1175连连看 DFS
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- hdoj1175 连连看(dfs+剪枝)
处理连连看问题. 要求拐弯方向不多于两次.剪枝很重要!!! 用dir记录当前方向.Orz,居然没想到. #include<iostream> #include<cstring> ...
- [HDOJ1175]连连看
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others) ...
- JavaScript编写连连看
这几天写题比较少,做了一下网页设计的期末大作业.搞了个连连看,核心代码和hdu 1175那个题目一样. 越来越觉得学ACM是十分有用的,软件的核心是数据结构和算法,学会了DFS,连连看就水到渠成了. ...
- 连连看游戏(dfs)【华为上机题目】
1 连连看游戏 今天同学给我做了道编程题目,貌似是华为的,题目描述大概是这样的: 给定一个连连看棋盘,棋盘上每个点都有各种图案(用非0数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否 ...
- HDU1175 连连看(DFS)
Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经 ...
- 连连看(dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others) ...
- hdu 1175(BFS&DFS) 连连看
题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...
- hdu1175连连看(dfs+细节)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
随机推荐
- linux 多线程信号处理总结
linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知 ...
- iOS开发之Xcode 如何使用API帮助
内容转载自<iOS开发指南 2.6.2 如何使用API帮助> 对于一个初学者来说,学会在Xcode中使用API帮助文档是非常重要的.下面我们通过一个例子来介绍API帮助文档的用法.在编写H ...
- Hashtable HashMap
Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...
- UEditor文档
UEditor文档http://fex.baidu.com/ueditor/Ueditor 前后端数据交互 http://blog.csdn.net/bobo_93/article/details/5 ...
- MyBatis学习笔记(三) 关联关系
首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...
- RTB
RTB —— Real Time Bidding 的简称,就是实时竞价.跟传统购买形式相比,RTB是在每一个广告展示曝光的基础上进行竞价,就是每一个PV都会进行一次展现竞价,谁出价高,谁的广告就会被这 ...
- xcode黑科技
1多开模拟器 使用命令行: cd /Applications/Xcode1.app/Contents/Developer/Applications/&open -n Simulator.app ...
- Sql Server判断某列字段是否为空或判断某列字段长度
1.用is null 和 is not null来判断字段是否为空. 2.用len()函数来判断字段长度.
- css清除默认样式和设置公共样式
/*公共样式--开始*/ html, body, div, ul, li, h1, h2, h3, h4, h5, h6, p, dl, dt, dd, ol, form, input, textar ...
- sass小总结
一般有两种后缀 .sass和.scss,推荐使用后者. 写下自己对sass的理解 1.变量 $border-color:#c66; $border:1px solid $border-color; ...