传送门

题意

给定一个n*m的矩阵,询问q次,两个方块是否能被消掉,弯折次数不超过两次

分析

这题写了有一个下午,思路很简单,但是有很多trick,(唉),我还是太弱

trick

初始判断:1.两点不重叠

2.两点数值相等并且不为空

dfs中判断:1.每次访问节点深搜时打访问标记,回溯取消标记

2.一个强力剪枝

if(cnt==2&&(x-x2)&&(y-y2)) return ;

讲解:如果当到达一点弯折度已达2,并且该点与终点不在同一行/列,则返回。

强力剪枝!将我交的第一发8517ms降到124ms,很强!

代码

#include<cstdio>
#include<cstring>
#define R(i,a,b) for(int i=a;i<b;++i)
#define F(i,a,b) for(int i=a;i<=b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
int t,n,m,a[1010][1010],q,x1,y1,x2,y2;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int flag;
void dfs(int x,int y,int cnt,int pre)
{
// printf("1.x=%d y=%d cnt=%d pre=%d\n",x,y,cnt,pre);
if(flag) return ;
if(x<1||y<1||x>n||y>m) return ;
if(cnt>2) return ;
if(cnt==2&&(x-x2)&&(y-y2)) return ;
//printf("(cnt==2&&(x-x2)&&(y-y2))=%d\n",(cnt==2&&(x-x2)&&(y-y2)));
//if(cnt==2&&(x-x2)&&(y-y2)) return ;
if(x2==x&&y2==y) { flag=1;return ; }
//printf("a[%d][%d]=%d\n",x,y,a[x][y]);
//printf("2.x=%d y=%d cnt=%d pre=%d\n",x,y,cnt,pre);
R(i,0,4)
{
int xx=x+dir[i][0],yy=y+dir[i][1];
int cnt1;
if(pre!=i) cnt1=cnt+1;else cnt1=cnt;
if(a[xx][yy]==0)
{
a[xx][yy]=1;
//printf("3.a[%d][%d]=%d\n",xx,yy,a[xx][yy]);
dfs(xx,yy,cnt1,i);
a[xx][yy]=0;
}
else if(xx==x2&&yy==y2)
{
dfs(xx,yy,cnt1,i);
if(flag) return ;
}
// printf("3.x=%d y=%d cnt=%d pre=%d\n",xx,yy,cnt,pre);
//if(pre!=i) dfs(xx,yy,cnt+1,i);else dfs(xx,yy,cnt,i);
}
}
int main()
{
while(scanf("%d %d",&n,&m),n+m)
{
F(i,1,n)F(j,1,m) scanf("%d",&a[i][j]);
for(scanf("%d",&q);q--;)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(a[x1][y1]!=a[x2][y2]||a[x1][y1]==0||(x1==x2&&y1==y2)) { flag=0;goto l; }
flag=0;
R(i,0,4)
{
int xx=x1+dir[i][0],yy=y1+dir[i][1];
if(xx<1||yy<1||xx>n||yy>m) continue;
if(flag) break;
if(a[xx][yy]==0)
{
a[xx][yy]=1;//已访问过
dfs(xx,yy,0,i);
a[xx][yy]=0;//回溯清标记
}
else if(xx==x2&&yy==y2)
{
dfs(xx,yy,0,i);
}
}
l:if(flag) puts("YES");else puts("NO");
}
}
}

HDU1175:连连看(搜索)的更多相关文章

  1. hdu1175 连连看(bfs疯狂MLE和T,遂考虑dfs+剪枝)

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1175/ 题目大意就是给出地图,上面有若干的数,相当于连连看,给了q个查询,问给出的两个位置的数能否在两次转弯以内 ...

  2. hdu1175连连看

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

  3. HDU1175 连连看(DFS)

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

  4. HDU1175 连连看(bfs) 2016-07-24 13:27 115人阅读 评论(0) 收藏

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

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

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

  6. hdu1175 连连看

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

  7. 连连看[HDU1175]

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

  8. 连连看(简单搜索)bfs

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

  9. 连连看 HDU - 1175_搜索_剪枝

    hdu有毒,考试上 AC 的就是一直 WA- 其实这道题是可以进行初始化来进行优化的,这样的话询问次数是可以达到 10510^5105 的.不过普通的 dfsdfsdfs + 剪枝也是可过的. Cod ...

随机推荐

  1. 洛谷——P1038 神经网络

    P1038 神经网络 题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  2. Python---django轻量级框架

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  3. MongoDB学习day09--Mongoose数据校验

    一.Mongoose检验参数 required : 表示这个数据必须传入max: 用于 Number 类型数据, 最大值 min: 用于 Number 类型数据, 最小值 enum:枚举类型, 要求数 ...

  4. [Angular] Expose Angular Component Logic Using State Reducers

    A component author has no way of knowing which state changes a consumer will want to override, but s ...

  5. MyBatis -- sql映射文件具体解释

    MyBatis 真正的力量是在映射语句中. 和对等功能的jdbc来比价,映射文件节省非常多的代码量. MyBatis的构建就是聚焦于sql的. sql映射文件有例如以下几个顶级元素:(按顺序) cac ...

  6. MongoDB使用入门

    1.MongoDB的安装 步骤一:下载MongoDB 下载安装包:http://fastdl.mongodb.org/linux/mongodb-linux-i686-2.0.4.tgz 步骤二:设置 ...

  7. leetcode笔记:Majority Element

    一. 题目描写叙述 Given an array of size n, find the majority element. The majority element is the element t ...

  8. 我们工作到底为了什么 (HP大中华区总裁孙振耀退休感言)

    我们工作到底为了什么 (HP大中华区总裁孙振耀退休感言) 一.关于工作与生活    我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司 ...

  9. C++问题记录

    问题idx: 1) 怎么在VS2010下新建一个像VC6.0 中那样的控制台C++程序. cdate: 2014-4-24 A1: VC6.0 对标准C++集的支持不是太好, VS2010也有一些吧, ...

  10. php截取某二个特殊字符串间的某段字符串

    在php开发的过程中,有时候会用到截取某二个特殊字符串间的某个字符串,并对这个字符串做特殊的处理,那么对截取出来的字符串做什么特殊处理我们临时无论.我们今天先讲php截取某二个特殊字符串间的某个字符串 ...