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+剪枝的更多相关文章

  1. Tempter of the Bone HDU 1010(DFS+剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  2. HDOj 1010 DFS优化

    #include<cstdio> #include<cstring> ]={,,,-}; ]={,,-,}; ][]; int x1,y1,x2,y2; int step; i ...

  3. HDOJ.1010 Tempter of the Bone (DFS)

    Tempter of the Bone [从零开始DFS(1)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tem ...

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

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

  5. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  6. *HDU1455 DFS剪枝

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

  7. POJ 3009 DFS+剪枝

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

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

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

  9. DFS(剪枝) POJ 1011 Sticks

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

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

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

随机推荐

  1. Phaser开源2d引擎 html5游戏框架中文简介

    功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash C ...

  2. img标签中alt和title属性的正确使用

    在的img标签有两个属性分别为alt和title,对于很多初学者而言对这两个属性的正确使用都还抱有迷惑,当然这其中一部分原因也是ie浏览器所导致的.正确的使用这两个属性除了可以提高图片的搜索能力外,在 ...

  3. 最短路径问题——bellman算法

    关于最短路径问题,最近学了四种方法——bellman算法.邻接表法.dijkstra算法和floyd-warshall算法. 这当中最简单的为bellman算法,通过定义一个边的结构体,存储边的起点. ...

  4. JSBinding + SharpKit / 编译 Cs 成 Js

    轻轻一点菜单:[JSB | Compile Cs to Js] 主要产出:StreamingAssets/JavaScript/SharpkitGeneratedFiles.javascript,你的 ...

  5. ubnt+ros 接入无线

    ubnt+ros 接入无线 一.ubnt配置(UBNT NanoStation LOCOM2 LOCO M2)1.ubnt接poe,转lan接到pc2.ubnt默认ip是192.168.1.20,用户 ...

  6. Android多媒体分析-通过MediaStore获取Audio信息

    public void getAlldata() { ContentResolver cr = getApplication().getContentResolver(); if (cr == nul ...

  7. SQL Server DBA日常查询视图_数据库对象视图

    1.数据库 use master; exec sp_helpdb 1.1查询数据库大小 1.2查询数据库状态 use msdb select name, user_access_desc, --用户访 ...

  8. [redis] redis.clients.jedis.exceptions.JedisDataException: MOVED 13102 127.0.0.1

    这个异常上网查了很久才知道原因: MOVED indicates that you're using Redis Cluster. ShardedJedis is not for Redis Clus ...

  9. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  10. jquery 如何遍历json

    var obj = {"status":1,"bkmsg":"\u6210\u529f","bkdata":[" ...