HDOJ(1010)DFS+剪枝
Tempter of the Bone
http://acm.hdu.edu.cn/showproblem.php?pid=1010
#include <stdio.h>
#include <stdlib.h>
char map[][];
int dx[]={,,-,};
int dy[]={,,,-};
bool flag;
int n,m,xd,yd,t; void DFS(int x,int y,int t)
{
if(t==) //到时间了符合条件flag=true再退出,不符合条件直接退出。
{
if(x==xd&&y==yd)
flag=true;
return;
}
int temp=abs(x-xd)+abs(y-yd)-t;
if(temp>||temp&) //temp&1相当于temp%2,但是temp%2会超时,位运算比较快
return; //奇偶性剪枝+最小步数大于时间剪枝
if(flag)
return; //找到解后还有部分在继续搜索,这句是为了让其它搜索停止
int i;
int next_x,next_y;
for(i=;i<;i++)
{
next_x=x+dx[i];
next_y=y+dy[i];
if(next_x>=&&next_x<=m&&next_y>=&&next_y<=n&&map[next_y][next_x]!='X')
{
map[next_y][next_x]='X';
DFS(next_x,next_y,t-);
map[next_y][next_x]='.'; //回溯,如果搜不到D,还要恢复成原来的路径
}
}
} int main()
{
int i,j;
int x,y;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(n==&&m==&&t==)
break;
int wall=;
for(i=;i<=n;i++)
{
scanf("%s",map[i]+); //尽量用%s, %c容易出错
for(j=;j<=m;j++)
{
if(map[i][j]=='S')
{
x=j;
y=i;
}
if(map[i][j]=='D')
{
xd=j;
yd=i;
}
if(map[i][j]=='X')
wall++;
}
}
if(n*m-wall<=t) //可以走的格子比时间少,直接剪掉
printf("NO\n");
else
{
flag=false;
map[y][x]='X';
DFS(x,y,t);
if(flag)
printf("YES\n");
else
printf("NO\n");
} }
return ;
}
深度优先搜索(DFS):解决迷宫问题(比如:能否逃离迷宫,只要判断能不能)
递归式基本框架:(不同的深搜代码千变万化)
void dfs(int si,int sj,int t) //si,sj为起始位置X行Y列坐标
{
int i;
if(si==di&&sj==dj&&t>=) // di,dj为目标位置,t为剩余时间,k为标记符号,可以就k=1
k=; // 能否在t时间内移动到坐标(di,dj)位置(逃离迷宫)?
if(si>=n||si<||sj>=m||sj<)
return; //防止走到地图外面去
if(k)
return; //终止条件,找到能出去的方法就直接return,不执行下面语句
for(i=;i<;i++) //dir[4][2]={1,0,0,1,-1,0,0,-1} 表示方向 :上下左右
{
if(map[si+dir[i][]][sj+dir[i][]]!='X')
{
map[si+dir[i][]][sj+dir[i][]]='X'; //把走过的地方标记成 X,防止又往回走,
//(走来走去就死循环啦!)
dfs(si+dir[i][],sj+dir[i][],t-); // 递归,进一步搜索下去
map[si+dir[i][]][sj+dir[i][]]='.'; //用回溯法,如果上面的深搜失败,就把图还原到原来的状态
}
}
}
广度优先搜索(BFS):适用解决最优解问题 (如:用时最少;代价最优;)
核心代码框架:
while(队列不为空)
{
node temp=Q.front();
//从该结点状态转移到其他状态
for(int i=;i<;i++) //int go[4][2] = {1,0,-1,0,0,1,0,-1}; 上下左右
{
int x=temp.x+go[i][];
int y=temp.y+go[i][];
int t=temp.t+;
//有选择的选择未出现过的状态入队 (用到哈希法,不明白的就百度一下 hash 吧)
if(hash[x][y]==false&&该点可行的条件)
{
if(x==dx&&y==dy) // 判断该状态是否为目的状态
return t;
hash[x][y]=true;
Q.push(newnode(x,y,t));
}
}
Q.pop(); // 弹出队列头结点
}
HDOJ(1010)DFS+剪枝的更多相关文章
- Tempter of the Bone HDU 1010(DFS+剪枝)
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...
- HDOj 1010 DFS优化
#include<cstdio> #include<cstring> ]={,,,-}; ]={,,-,}; ][]; int x1,y1,x2,y2; int step; i ...
- HDOJ.1010 Tempter of the Bone (DFS)
Tempter of the Bone [从零开始DFS(1)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tem ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- *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 相同长度的木棍不再搜索 ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- magento中如何实现产品图片放大效果
Magento列表页用jQuery实现产品图片放大效果今天看到个网站,鼠标移到列表页的产品图片上,旁边会弹出一个大图,感觉不错,就自己在Magento里写了个.先看看效果 这个效果比较好实现,打开li ...
- 转 UML类图几种关系的总结
UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregati ...
- Java-->利用URL类下载图片
--> 通过get 请求访问图片地址,将通过服务器响应的数据(即图片数据)存到本地文件中... --> HttpURLConnectionUtil 工具类 package com.drag ...
- cocos2d 保存最近登陆多个账号最多一个月
用的是一个单例来管理 ,数据是存在本地的xml文件里的格式如下 <?xml version="1.0" encoding = "utf-8" ?> ...
- Anchor 对象和document对象
<script type="text/javascript"> function chanklink(){ document.getElementById(" ...
- 导航代码position:relative
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- Docker之Web-UI
DockerUI 不支持多主机Command: docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock dock ...
- Base64编码解码
一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送.这样用途就受到了很大的 ...
- .Net , 请取服务器上的文件
public class IdentityScope : IDisposable { /// <summary> /// 登录一个新用户 /// </summary> /// ...
- 3D Touch集成过程整理
1.集成App图标按压快速打开某个功能 在AppDelegate.m中加入以下三个东西 在启动方法里加入3D Touch菜单 - (BOOL)application:(UIApplication *) ...