hdoj1175 连连看(dfs+剪枝)
处理连连看问题。
要求拐弯方向不多于两次。剪枝很重要!!!

用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+剪枝)的更多相关文章
- HDOJ1175连连看 DFS
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- HDU 1175 连连看 (DFS+剪枝)
<题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- LA 6476 Outpost Navigation (DFS+剪枝)
题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...
随机推荐
- Apache模块开发
一.简介 Apache HTTP服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能.可以在编译时选择被静态包含进httpd二进制映象的模块,也可以编译成独立于主httpd二进制映象的 ...
- 都是假的!这位小姐姐 P 的图,认真看你就输了!
开门见山,先来看张图: 肯定有不少小伙伴用不屑的语气说,嗬!一看就是 P 的! 是的,任谁都能一眼看出来是假的.但你可能想象不到,这张图的原始素材是有多么……支离破碎,熊是动物园里的,小孩是在家门口站 ...
- [Fiddler] 开启Fiddler抓包的时候产品报“证书错误”
报错截图: 解决办法:同时开启产品和Fiddler,做如下处理:
- javascript札记
bind和unbind对应,live和die对应,千万别用bind绑定,用die解除.还有bind可以多次绑定同一个函数,可能会被执行多次同一个函数 正则表达式的使用 var email_reg = ...
- JedisPoolConfig解说
版本一 今天发现Jedis 默认的连接方式 jedis=new Jedis(“localhost”,6379),老是发生connection timeout. 后来发现jedis类包还有一种可以设置最 ...
- LA 3708 && POJ 3154 Graveyard (思维)
题意:在周长为10000的圆上等距分布着n个雕塑,现在又加入m个,现在让m+n个等距分布,那就得移动一些原有的雕塑,问你移动的最少总距离是多少. 析:首先我们可以知道,至少有一个雕塑是可以不用移动的, ...
- MODIS产品分析和数据处理
ENVI+IDL 17种MODIS产品的功能解释 https://wenku.baidu.com/view/6fd329dcf524ccbff0218440.html ENVI读取MODIS数据大致步 ...
- PhotoModeler Scanner教程
Marking and Referencing 标记和校正 标记和校正是通过多张照片人工匹配共同特征的过程.点击一张图片的明显视觉特征,然后将它匹配到不同角度拍摄的其他图片的相同特征上. Approp ...
- [Android]高低API版本兼容之@TargetApi
使用@TargetApi annotaion, 使高版本API的代码在低版本SDK不报错 例如: AsyncTask.THREAD_POOL_EXECUTOR, 这个静态变量是API11才有的, 设置 ...
- hdu 5019
http://acm.hdu.edu.cn/showproblem.php?pid=5019 给出X 和Y,求出第K 大的 X 和Y 的公约数. 暴力求出所有公约数 #include <cstd ...