HDU 1175 连连看 (DFS+剪枝)
<题目链接>
题目大意:
在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次。
解题分析:
就是DFS从起点开始搜索,只不过搜索的时候需要记录当前的方向和已经转弯的次数,然后通过题目给定的限制条件进行搜索,判断是否存在从起点到终点转弯次数不超过2次的连线。同时,在转弯次数达到两次的时候,我们可以对搜索树进行可行性剪枝,直接判断转弯两次后,该点与终点是否在同一条直线上,从而减少搜索时间。
#include <bits/stdc++.h>
using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++)
const int N= 1e3+;
int mpa[N][N],vis[N][N];
int n,m,sx,sy,ex,ey;
const int dir[][]={,,,,-,,,-};
bool fp; void dfs(int x,int y,int nowdir,int cnt){
vis[x][y]=;
if(cnt>||fp)return;
if(x==ex&&y==ey){ fp=true;return; }
for(int k=;k<;k++){
int cnt1=cnt;
int nx=x+dir[k][],ny=y+dir[k][];
if(nx<||nx>n||ny<||ny>m||vis[nx][ny])continue;
if((nx==ex&&ny==ey)||!mpa[nx][ny]){
if((nowdir!=-)&&nowdir!=k){
cnt1++;if(cnt1==){
if((nx-ex)!=&&(ny-ey)!=)return; //如果第二次转弯与终点不在同一条直线上
else{ //转了2次后,判断该点是否能够通过这条直线到达终点
int xx=nx,yy=ny;
while(xx>=||xx<=n||yy>=||yy<=m){
if(xx==ex&&yy==ey){ fp=true; return; } //如果通过该直线能够直接到达终点
if(mpa[xx][yy]!=)return; //如果中途除终点外有障碍物
xx=xx+dir[k][],yy=yy+dir[k][]; //沿着这条直线往前走
}
}
}
}
dfs(nx,ny,k,cnt1);
}
}
} int main(){
while(~scanf("%d%d",&n,&m),n||m){
rep(i,,n) rep(j,,m) scanf("%d",&mpa[i][j]);
int q;scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(sx<||sx>n||sy<||sy>m||ex<||ex>n||ey<||ey>m||(sx==ex&&sy==ey)){puts("NO");continue;} //判断这两点的位置合不合法
fp=false;
memset(vis,,sizeof(vis));
if(mpa[sx][sy]==mpa[ex][ey]&&mpa[sx][sy])dfs(sx,sy,-,); //如果起点终点相同,且有棋子
fp?puts("YES"):puts("NO");
}
}
}
WA代码
AC代码:
#include <bits/stdc++.h>
using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++)
const int N = 1e3+;
int mpa[N][N];
bool vis[N][N];
int n,m,q,sx,sy,ex,ey;
bool flag;
const int dicx[]={,-,,};
const int dicy[]={,,,-}; void dfs(int x,int y,int dic,int cnt){
if(cnt>||flag) return; //转弯次数大于2或者已经找到就终止
if(cnt==&&(x-ex)!=&&(y-ey)!=) return;//剪枝:判断两次转弯后是否与目标在同一直线上
if(x==ex&&y==ey){ flag=true;return; }
for(int k=;k<;++k){
int xx=x+dicx[k],yy=y+dicy[k];
if(xx<||xx>n||yy<||yy>m||vis[xx][yy]) continue;
if(mpa[xx][yy]==||(xx==ex&&yy==ey)){
vis[xx][yy]=;
if(dic==-||dic==k)dfs(xx,yy,k,cnt);
else dfs(xx,yy,k,cnt+);
vis[xx][yy]=;
}
}
}
int main(){
while(~scanf("%d%d",&n,&m),n||m){
rep(i,,n) rep(j,,m) scanf("%d",&mpa[i][j]);
scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
memset(vis,,sizeof(vis));
flag=false;
if(mpa[sx][sy]==mpa[ex][ey]&&mpa[sx][sy])dfs(sx,sy,-,); //初始方向置为-1
flag?puts("YES"):puts("NO");
}
}
}
HDU 1175 连连看 (DFS+剪枝)的更多相关文章
- hdu 1175 连连看 DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...
- HDU 1175 连连看(超级经典的bfs之一)
传送门: 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 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...
- HDU - 1175 连连看 【DFS】【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...
- Hdu 1175 连连看(DFS)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...
- HDU 1175 连连看 (深搜+剪枝)
题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
- hdu - 1072(dfs剪枝或bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 思路:深搜每一个节点,并且进行剪枝,记录每一步上一次的s1,s2:如果之前走过的时间小于这一次, ...
- hdu 1175 连连看 (深搜)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...
随机推荐
- 锤子科技"临死前"被"接盘" ,内部人士爆料已改签今日头条母公司
就在昨天,据据锤子科技内部人士透露,部分锤子科技员工在昨天已经接到了相关的临时通知,要求改签劳动合同至今日头条的母公司——字节跳动.至于这是锤子科技真正再度复活还是借尸还魂都不重要,重要的是,作为忠实 ...
- "字体arial不支持样式regular"的解决方法
软件报错,提示“字体arial不支持样式regular”的提示,这是由于字体arial缺失导致的, “字体arial不支持样式regular”的解决方法如下: 方法/步骤 1.用户需要先下载arial ...
- HTML中特殊符号的处理
一.写在前面 今天在写页面时记不清大/小于符号该怎么写,于是就想着整理一下方便后面用到! 二.HTML中常用特殊符号的处理 < < 小于号或显示标记 > ...
- 【JDK】JDK模块化(1)-为什么要模块化
Java9发布已经有一年了,跟Java8相比,从目录对比就看得出来差别相当大. 实际上Java9最大的变化就是JDK模块化(Modular). 那么,模块化的目的是什么呢? 官方的说法是: 之前版本的 ...
- git使用中出现的错误
因同时有两个git账户,之前登录了git A 用户在使用了 1. 长期存储密码 git config --global credential.helper store 之后在git B 账 ...
- 《剑指offer》 反转链表
本题来自<剑指offer> 反转链表 题目: 输入一个链表,反转链表后,输出新链表的表头. 思路: 需要三个变量,来保存当前节点的,前面节点和反转后的节点. C++ Code: /* st ...
- c++与java的几个不同点
Java.C.C++在近两年一直稳居世界编程语言排行榜前三名.Java与c++都是面向对象的语言,但Java晚于C++发布,部分语法和思想也参考了C++,只是Java 没有头文件.指针.运算符重载.虚 ...
- solt插槽简单使用实例
在父组件内可以定义方法,变量 等,还可以在父组件中使用呢. 样式可以在子组件里写,也可以在父组件写. 子组件: <template> <div class="admin-u ...
- Django中各目录文件的作用
一般的项目结构如下(大同小异) my_site是一个项目,blog是项目下的应用之一,可以使用创建命令创建更多的应用. 最上层的django文件夹: 自己手动创建,名字随意. 第二层my_site文件 ...
- ecilpse运行Servlet程序是找不到路径的原因
当工作空间路径有空格时,空格会被转成%20,将导致路径无法识别,于是就找不到路径了.