处理连连看问题。

要求拐弯方向不多于两次。剪枝很重要!!!

用dir记录当前方向。Orz,居然没想到。

 #include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 1005
using namespace std;
const int dx[]={-,,,},dy[]={,,-,};
int map[maxn][maxn],V[maxn][maxn];
int n,m,flag,x1,x2,y1,y2;
void dfs(int x,int y,int num,int dir){
if (flag || x< || x>=n || y< || y>=m || V[x][y]) return ;
if (num== && x!=x2 && y!=y2) return ;//当拐弯数为2,但与终点不在同一方向
if (num>) return ;
if (num<= && x==x2 && y==y2){
flag=;
return ;
}
if (map[x][y]!=){
if (x==x1 && y==y1) ;
else return ;
}//当前不为零且不为起点,即路径上有棋子
V[x][y]=;
for (int i=;i<;i++){
int xx=x+dx[i],yy=y+dy[i];
if (i==dir) dfs(xx,yy,num,i);
else dfs(xx,yy,num+,i);
}
V[x][y]=;
return ;
}
int main(){
int t;
while (cin >> n >> m && n+m){
memset(map,,sizeof(map));
for (int i=;i<n;i++){
for (int j=;j<m;j++){
cin >> map[i][j];
}
}
cin >> t;
while (t--){
cin >> x1 >> y1 >> x2 >> y2;
x1--,y1--,x2--,y2--;
if (x1==x2 && y1==y2){
cout << "NO\n";
continue;
}//起点与终点相同不能消去
if (map[x1][y1]!=map[x2][y2] || !map[x1][y1] || !map[x2][y2]){
cout << "NO\n";
continue;
}//起点与终点不同,或起点或终点位置没有棋子
if (x1< || x1>=n || y1< || y1>=m || x2< || x2>=n || y2< || y2>=m){
cout << "NO\n";
continue;
}//所给坐标超出当前范围
flag=;
memset(V,,sizeof(V));
for (int i=;i<n;i++){
dfs(x1+dx[i],y1+dy[i],,i); //从一个点的四个方向开始 ,拐弯数 ,当前方向
}
if (flag) cout << "YES\n";
else cout << "NO\n";
}
}
return ;
}

hdoj1175 连连看(dfs+剪枝)的更多相关文章

  1. HDOJ1175连连看 DFS

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

  2. HDU 1175 连连看 (DFS+剪枝)

    <题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...

  3. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  5. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  6. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  7. DFS+剪枝 HDOJ 5323 Solve this interesting problem

    题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...

  8. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  10. LA 6476 Outpost Navigation (DFS+剪枝)

    题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...

随机推荐

  1. 757A Gotta Catch Em' All!

    A. Gotta Catch Em' All! time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. gruop by报错this is incompatible with sql_mode=only_full_group_by

    set @@GLOBAL.sql_mode=''; set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_ ...

  3. ubuntu关闭防火墙

    https://jingyan.baidu.com/article/73c3ce283ee2c1e50343d9f6.html

  4. VMware下的Linux系统中Windows的共享目录,不支持创建软连接

    [问题]  在编译VMware下的Linux系统对从Windows中共享过来的文件,进行编译的时候,遇到:  ln: creating symbolic link XXXXXX : Operation ...

  5. Java数据结构和算法(三)顺序存储的树结构

    Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...

  6. 1、HttpClient初探

    HttpClient是它的核心接口.可以理解为一个简单的浏览器. 主要方法有: getParams();   获取运行参数 getConnectionManager(); 获取连接管理器.连接管理器中 ...

  7. 项目 solrcloud / zookeeper 搭建

    财经道网站搜索引擎,数据快速检索,数据集群 功能描述:使用solr为项目数据库表p2p,银行理财,基金,贷款,信托,保险等建立数据索引,实现数据的导入,增量索引.实现检索建议和数据的快速查找.使用zo ...

  8. HTTP Error 403.14问题处理

    打开目录浏览后,点击启用.

  9. Cygwin工具的简单使用

    简介 从使用角度来看:Cygwin就是一个windows软件,该软件就是在windows上仿真linux操作系统.简言之,cygwin是一个在windows平台上运行的 linux模拟环境,使用一个D ...

  10. HDU 2138 How many prime numbers (判素数,米勒拉宾算法)

    题意:给定一个数,判断是不是素数. 析:由于数太多,并且太大了,所以以前的方法都不适合,要用米勒拉宾算法. 代码如下: #include <iostream> #include <c ...