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 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...
随机推荐
- 神经网络之 Batch Normalization
知乎 csdn Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce ...
- WinSCP安装与使用
WinSCP 是一个 Windows 环境下使用的 SSH(Source Shell)的开源图形化 SFTP(SSH File Transfer Protocol) 客户端.同时支持 SCP(So ...
- Confluence 6 企业环境或者网站托管的 Java 配置策略
Confluence 需要依赖一些 Java 的库才能够允运行.一些依赖的 Java 库应用了 Java 的语言特性,但是又是被 Java 的安全策略所限制的. 这个通常来说是不会造成任何问题的.默认 ...
- Confluence 6 安全概述和建议概述
这个文档是针对 Confluence 的系统管理员希望对 Confluence Web应用程序安全性进行评估而设计的.这个页面将对系统的安全进行大致的描述,同时也会对 Confluence 的安全配置 ...
- 从 Confluence 5.3 及其早期版本中恢复空间
如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话.你可以使用临时的 Confluence 空间安装,然后将 ...
- Confluence 6 配置一个数据源连接
这个指南指导你如何配置使用 JNDI 数据源来连接到你的数据库.使用这个类型的连接,Confluence 将会询问应用服务器(Tomcat)中你配置的连接信息. 如果你希望使用 JDBC 的数据库连接 ...
- 断路器Feign
Feign是自带断路器,需要在配置文件中开启断路器 改造消费者项目(FeignDemo) 1.在application.yml配置文件中开启断路器 eureka: client: service-ur ...
- Linux磁盘与文件系统管理笔记
### Linux磁盘与文件系统管理 linux 最传统的文件系统格式是EXT2,centos7 默认文件系统是xfs(日志式文件系统) 磁盘的组成: 盘片 机械手臂 主轴马达 (机械硬盘) 磁盘格式 ...
- LeetCode(84): 柱状图中最大的矩形
Hard! 题目描述: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度 ...
- 《剑指offer》顺时针打印矩阵
本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...