逃离迷宫

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管理员密码忘记了怎么办?

    ECSHOP管理员密码忘记了怎么办? ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-09-06   不小心在后台把管理员全部给清空了,闹的网站都无法登陆了?有 ...

  2. tp框架表单验证

    之前的表单验证都是用js写的,这里也可以使用tp框架的验证.但是两者比较而言还是js验证比较好,因为tp框架验证会运行后台代码,这样运行速度和效率就会下降. 自动验证是ThinkPHP模型层提供的一种 ...

  3. hdu 2041 超级楼梯

    斐波那契数列,看清题意,当前为第一阶,给出M(每次只能跨1阶或2阶) 从第一阶到M,若M=1,从1-1不用走,0种方法 若M=2 从1-2  一种方法  -> 1.走一次一阶 若M=3 从1-3 ...

  4. Cannot attach the file as database 'membership'.

    Cannot attach the file 'D:\GitHome\cae\CAE\App_Data\membership.mdf' as database 'membership'. 说明: 执行 ...

  5. MySQL导出数据库

    MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd D:\Program\MySQL\MySQL Server 5.0 ...

  6. C#验证是否是真的图片格式

    做图片上传功能时,我们要限制用户上传的图片格式和大小. 但是,还有一种情况就是验证用户伪造的符合要求的图片,这种情况就必须要验证文件的真正格式. C#的办法时可以通过将文件读成二进制流,取前两个字节判 ...

  7. NoClassDefFoundError: org/slf4j/LoggerFactory解决

    缺少slf4j-api-1.5.2,slf4j-log4j12-1.5.2,log4j-1.2.8这几个包,导入即可

  8. require.async换这个方法的transport问题

    这个方法是用于在模块中异步加载其他模块的,类似于在页面上的seajs.use. 比如需要在特定条件下才去加载a模块,不必每次都加载,类似于下面这样的代码 if({{some_condition}}){ ...

  9. sqlserver2012相关资源下载

    1.输入网址http://www.codeplex.com 2.找到Microsoft SqlServer Product Samples选项 3.进入之后显示如下页面 4.选择SQL Server ...

  10. 3月20,html

    html,表格的练习: 1,给图片做链接<br /><img src="200712211720988_2.jpg" usemap="A" w ...