逃离迷宫

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13562    Accepted Submission(s): 3221

Problem Description
  给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
 
Input
  第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
  第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
 
Output
  每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
 
Sample Input

...**
*.**.
.....
.....
*.... ...**
*.**.
.....
.....
*....
Sample Output
no
yes
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  1072 1372 1254 2102 1548 

 
  搜索,DFS剪枝
  这道题用BFS做会很简单,用DFS的话就容易超时,需要注意剪枝。
  思路是,用一个数组记录转弯的次数,如果下一步要转弯的话,判断是否比下一步原来存储的转弯次数要大,如果比原来的还大的话,则不走这一步。这是主要的剪枝,避免了很多重复的递归过程。
  代码:
 #include <stdio.h>
#include <string.h>
#define inf 0x7fffffff
int m,n,k,x1,y1,x2,y2;
char a[][];
int w[][];
bool isv[][];
int dx[] = {,,,-};
int dy[] = {,,-,};
bool f;
bool judge(int x,int y)
{
if(x>m || x< || y>n || y<)
return true;
if(isv[x][y])
return true;
if(a[x][y] == '*')
return true;
return false;
}
void dfs(int cx,int cy,int d)
{
if(cx==x2 && cy==y2){
if(w[x2][y2]<=k)
f = true;
return ;
}
int i;
for(i=;i<;i++){
int nx = cx + dx[i];
int ny = cy + dy[i];
if(d!=i && w[cx][cy]==k) //如果与上一步的方向不同(也就是说这一步要转弯)而当前转弯次数已达允许的最大转弯次数k,则不可能
continue;
if(d != - && i != d && w[nx][ny] < w[cx][cy] + ) //主要剪枝。如果下一步原来存储的转弯次数比走这一步转弯用的次数还小,则,不走这一步
continue;
if(judge(nx,ny)) //判断可走否
continue;
w[nx][ny] = w[cx][cy];
if(d!=i)
w[nx][ny]++;
if(w[nx][ny]>k)
continue;
//可以走
isv[nx][ny] = true;
dfs(nx,ny,i);
isv[nx][ny] = false;
if(f) return ;
}
}
int main()
{
int i,j,T;
scanf("%d",&T);
while(T--){
f = false;
scanf("%d%d%*",&m,&n);
for(i=;i<=m;i++){ //输入地图
for(j=;j<=n;j++){
scanf("%c",&a[i][j]);
w[i][j] = inf;
}
scanf("%*");
}
scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
memset(isv,,sizeof(isv));
isv[x1][y1] = true;
w[x1][y1] = -;
dfs(x1,y1,-);
if(f)
printf("yes\n");
else
printf("no\n");
}
return ;
}

Freecode : www.cnblogs.com/yym2013

hdu 1728:逃离迷宫(DFS,剪枝)的更多相关文章

  1. HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. HDU 1728 逃离迷宫(DFS||BFS)

    逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...

  3. hdu 1728 逃离迷宫 [ dfs ]

    传送门 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. hdu 1728 逃离迷宫 bfs记转向

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  5. hdu 1728 逃离迷宫 bfs记步数

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  6. HDU 1728 逃离迷宫(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)  ...

  7. HDU 1728 逃离迷宫

    [题目描述 - Problem Description] 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,glo ...

  8. hdu 1728 逃离迷宫 (BFS)

    逃离迷宫 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  9. hdu 1728 逃离迷宫(dFS+优先队列)

    求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...

随机推荐

  1. 将ECSHOP会员注册页面的Email修改成非必填项

    将ECSHOP会员注册页面的Email修改成非必填项 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2011-07-29   有人说,在后台的 “会员注册项设置 ”里面 ...

  2. jQuery插件开发教程

    jQuery插件开发教程  ——让你的jQuery水平提升一个台阶 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台 ...

  3. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  4. 使用ymPrompt弹框

    使用弹框 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&q ...

  5. javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

    客户端向服务器发送数据时,份两种情况,SSL单向验证和SSL双向验证 1.SSL单向验证时 代码如下: import java.io.IOException; import java.util.Has ...

  6. SQLite常见警告

    引言 在vs2012中使用sqlite时,总会出现一个警告,lz是完美型的人,看到一个警告,心里多少看着不舒服啊. 解决办法 警告内容: 所生成项目的处理器架构“MSIL”与引用“System.Dat ...

  7. Ueditor的两种定制方式

    引言 UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... 官网:http://ueditor ...

  8. AngularJS--学习笔记(一)

    AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. 对于PhoneCat项目的 ...

  9. NSArray和NSMutableArray

    //1. NSArray EOItems *eOItems = [[EOItems alloc] init]; eOItems.ID = [NSNumber numberWithInt:]; NSAr ...

  10. hiho #1283 hiho密码 [Offer收割]编程练习赛3

    #1283 : hiho密码 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho根据最近在密码学课上学习到的知识,开发出了一款hiho密码,这款密码的秘钥是这样生成的 ...