hdu 1728:逃离迷宫(DFS,剪枝)
逃离迷宫
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13562 Accepted Submission(s): 3221
第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对应行。
...**
*.**.
.....
.....
*.... ...**
*.**.
.....
.....
*....
#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,剪枝)的更多相关文章
- HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1728 逃离迷宫(DFS||BFS)
逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可 ...
- hdu 1728 逃离迷宫 [ dfs ]
传送门 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 1728 逃离迷宫 bfs记转向
题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- hdu 1728 逃离迷宫 bfs记步数
题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- HDU 1728 逃离迷宫(DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) ...
- HDU 1728 逃离迷宫
[题目描述 - Problem Description] 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,glo ...
- hdu 1728 逃离迷宫 (BFS)
逃离迷宫 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...
- hdu 1728 逃离迷宫(dFS+优先队列)
求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...
随机推荐
- JavaScript 技巧总结
日期1. 日期时间戳 +new Date() = new Date().getTime() 数组1. 类数组转数组 var arr = Array.prototype.slice.call(argum ...
- c++实现加密和解密算法以及JNI技术的应用实例
#include "jiami.h" #include "jni.h" #include "com_test_start_CommonClassLoa ...
- Javascript网页摇一摇
function init(){ if (window.DeviceMotionEvent) { // 移动浏览器支持运动传感事件 window.addEventListener('devicemot ...
- POJ 3537 Crosses and Crosses
Crosses and Crosses Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2237 Accepted: 821 Ca ...
- ++X 与 X++ 的区别
<?php $x=10; echo ++$x; // 输出 11 $y=10; echo $y++; // 输出 10 $z=5; echo --$z; // 输出 4 $i=5; echo $ ...
- Goldbach's Conjecture
Goldbach's Conjecture Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- 理解Java中的接口
一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...
- HTTP长连接短连接
一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...
- OpenCV入门(二)
这次主要学习了下滤波,就当复习了图像处理的知识了:http://blog.csdn.net/poem_qianmo/article/details/22745559 代码实现比较简单,但关于通过滚动条 ...
- Struts2配置文件模板
<?xml version = "1.0" encoding = "UTF-8"?><!--下面是Struts2配置文件的DTD信息 --&g ...