传送门

题意

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

分析

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

trick

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

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

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

2.一个强力剪枝

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

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

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

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #define R(i,a,b) for(int i=a;i<b;++i)
  4. #define F(i,a,b) for(int i=a;i<=b;++i)
  5. #define mem(a,b) memset(a,b,sizeof(a))
  6. int t,n,m,a[1010][1010],q,x1,y1,x2,y2;
  7. int dir[4][2]={0,1,1,0,0,-1,-1,0};
  8. int flag;
  9. void dfs(int x,int y,int cnt,int pre)
  10. {
  11. // printf("1.x=%d y=%d cnt=%d pre=%d\n",x,y,cnt,pre);
  12. if(flag) return ;
  13. if(x<1||y<1||x>n||y>m) return ;
  14. if(cnt>2) return ;
  15. if(cnt==2&&(x-x2)&&(y-y2)) return ;
  16. //printf("(cnt==2&&(x-x2)&&(y-y2))=%d\n",(cnt==2&&(x-x2)&&(y-y2)));
  17. //if(cnt==2&&(x-x2)&&(y-y2)) return ;
  18. if(x2==x&&y2==y) { flag=1;return ; }
  19. //printf("a[%d][%d]=%d\n",x,y,a[x][y]);
  20. //printf("2.x=%d y=%d cnt=%d pre=%d\n",x,y,cnt,pre);
  21. R(i,0,4)
  22. {
  23. int xx=x+dir[i][0],yy=y+dir[i][1];
  24. int cnt1;
  25. if(pre!=i) cnt1=cnt+1;else cnt1=cnt;
  26. if(a[xx][yy]==0)
  27. {
  28. a[xx][yy]=1;
  29. //printf("3.a[%d][%d]=%d\n",xx,yy,a[xx][yy]);
  30. dfs(xx,yy,cnt1,i);
  31. a[xx][yy]=0;
  32. }
  33. else if(xx==x2&&yy==y2)
  34. {
  35. dfs(xx,yy,cnt1,i);
  36. if(flag) return ;
  37. }
  38. // printf("3.x=%d y=%d cnt=%d pre=%d\n",xx,yy,cnt,pre);
  39. //if(pre!=i) dfs(xx,yy,cnt+1,i);else dfs(xx,yy,cnt,i);
  40. }
  41. }
  42. int main()
  43. {
  44. while(scanf("%d %d",&n,&m),n+m)
  45. {
  46. F(i,1,n)F(j,1,m) scanf("%d",&a[i][j]);
  47. for(scanf("%d",&q);q--;)
  48. {
  49. scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
  50. if(a[x1][y1]!=a[x2][y2]||a[x1][y1]==0||(x1==x2&&y1==y2)) { flag=0;goto l; }
  51. flag=0;
  52. R(i,0,4)
  53. {
  54. int xx=x1+dir[i][0],yy=y1+dir[i][1];
  55. if(xx<1||yy<1||xx>n||yy>m) continue;
  56. if(flag) break;
  57. if(a[xx][yy]==0)
  58. {
  59. a[xx][yy]=1;//已访问过
  60. dfs(xx,yy,0,i);
  61. a[xx][yy]=0;//回溯清标记
  62. }
  63. else if(xx==x2&&yy==y2)
  64. {
  65. dfs(xx,yy,0,i);
  66. }
  67. }
  68. l:if(flag) puts("YES");else puts("NO");
  69. }
  70. }
  71. }

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. Mysqli的常用函数

    Mysqli的常用函数 连接数据库: $res = @mysqli_connect($host,$username,$pass,$db_name); if (mysqli_connect_errno( ...

  2. Back弹出AlertDialog

    package com.pingyijinren.helloworld.activity; import android.content.DialogInterface; import android ...

  3. Borg Maze-POJ3026(bfs+最小生成树)

    http://poj.org/problem?id=3026 如果一个一个普通搜处理不好的话会超时  可以连到一块搜 我觉得这个方法特别好 #include<stdio.h> #inclu ...

  4. 2017-10-04-afternoon

    注意完全平方数统计时的特判 #include <cstdio> inline void read(int &x) { x=; register char ch=getchar(); ...

  5. response对象学习

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  6. TUN/TAP区别

    在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备.不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能. TA ...

  7. uva558 Wormholes SPFA 求是否存在负环

    J - Wormholes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  8. CentOS 6.x ELK(Elasticsearch+Logstash+Kibana)

    CentOS 6.x ELK(Elasticsearch+Logstash+Kibana) 前言 Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案, ...

  9. EJB学习(三)——java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to..

    在上一篇博客介绍了怎样使用使用Eclipse+JBOSS创建第一个EJB项目,在这期间就遇到一个错误: Exception in thread "main" java.lang.C ...

  10. Robotframework集成jenkins执行用例

    Robotframework+jenkins配置 假设我们完成了一个模块的用例设计,可是想晚上9点或凌晨运行,这时候该怎么实现呢?jenkins可以很好解决我们的疑难. Jenkins安装 这里简单说 ...