[HDU 2102] A计划(搜索题,典型dfs or bfs)
A计划
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15567 Accepted Submission(s): 3886
Problem Description
怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃
公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探
所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时
空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移
动只能通过时空传输机,且不需要任何时间。
Input
Output
Sample Input
Sample Output
import java.util.Scanner;
public class Main {
public static boolean flag = false;
public static char[][] mg1;
public static char[][] mg2;
public static void main( String[] args ) {
int n, m, t;
int q;
Scanner sc = new Scanner( System.in );
while( sc.hasNext() ) {
q = sc.nextInt();
for( int c = 0; c < q; c++ ) {
n = sc.nextInt();
m = sc.nextInt();
t = sc.nextInt();
flag = false;
mg1 = new char[ n ][ m ];
mg2 = new char[ n ][ m ];
for( int ni = 0; ni < n; ni++ ) {
mg1[ ni ] = sc.next().toCharArray();
}
for( int ni = 0; ni < n; ni++ ) {
mg2[ ni ] = sc.next().toCharArray();
}
search( mg1, new Point2D( 0, 0 ), t );
if( flag ) {
System.out.println( "YES" );
} else {
System.out.println( "NO" );
}
}
}
}
/*
* search和seach2 分别是两层迷宫的搜索,逻辑上基本是相同的,注意一下当传送之后的情况,如果是#和*都是死路就行了。
*/
private static void search( char[][] mg1, Point2D point, int t ) {
if( !constraint( point, mg1, t ) )
return;
if( mg1[ point.n ][ point.m ] == '*' )
return;
if( mg1[ point.n ][ point.m ] == 'P' ) {
flag = true;
}
if( mg1[ point.n ][ point.m ] == '#' ) {
if( mg2[ point.n ][ point.m ] == '#' || mg2[ point.n ][ point.m ] == '*' ) {
return;
}
search2( mg2, new Point2D( point.n, point.m ), t );
} else {
//设置为*,防止重复搜索,效果类似于visited标记数组。
mg1[ point.n ][ point.m ] = '*';
search( mg1, new Point2D( point.n, point.m + 1 ), t - 1 );
search( mg1, new Point2D( point.n, point.m - 1 ), t - 1 );
search( mg1, new Point2D( point.n + 1, point.m ), t - 1 );
search( mg1, new Point2D( point.n - 1, point.m ), t - 1 );
mg1[ point.n ][ point.m ] = '.';
}
}
private static void search2( char[][] mg2, Point2D point, int t ) {
if( !constraint( point, mg2, t ) )
return;
if( mg2[ point.n ][ point.m ] == '*' )
return;
if( mg2[ point.n ][ point.m ] == 'P' ) {
flag = true;
}
if( mg2[ point.n ][ point.m ] == '#' ) {
if( mg1[ point.n ][ point.m ] == '#' || mg1[ point.n ][ point.m ] == '*' ) {
return;
}
search( mg1, new Point2D( point.n, point.m ), t );
} else {
mg2[ point.n ][ point.m ] = '*';
search2( mg2, new Point2D( point.n, point.m + 1 ), t - 1 );
search2( mg2, new Point2D( point.n, point.m - 1 ), t - 1 );
search2( mg2, new Point2D( point.n + 1, point.m ), t - 1 );
search2( mg2, new Point2D( point.n - 1, point.m ), t - 1 );
mg2[ point.n ][ point.m ] = '.';
}
}
private static boolean constraint( Point2D point, char[][] mg, int t ) {
if( point.n < 0 || point.n >= mg.length || point.m < 0 || point.m >= mg[ 0 ].length ) {
return false;
}
if( t < 0 ) {
return false;
}
return true;
}
}
class Point2D {
public int n;
public int m;
public Point2D( int n, int m ) {
this.n = n;
this.m = m;
}
}
我原本的写法不是这样的,我原本的思路是使用三维数组mg[x][y][z]去直观的表示,如果发生跳跃就直接 (x+1)%2就可以简化了代码量了。
However,too young too naive~三维数组的效率相比二维数组真的慢好多好多,以后需要谨记,谨慎使用多维数组!
一下就是TLE的三维数组的代码
(超时代码)
import java.util.Scanner;
public class Main {
public static boolean flag = false;
public static void main( String[] args ) {
int n, m, t;
int q;
Scanner sc = new Scanner( System.in );
while( sc.hasNext() ) {
q = sc.nextInt();
for( int c = 0; c < q; c++ ) {
n = sc.nextInt();
m = sc.nextInt();
t = sc.nextInt();
flag = false;
char[][][] mg = new char[ 2 ][ n ][ m ];
for( int i = 0; i < 2; i++ ) {
for( int ni = 0; ni < n; ni++ ) {
String s = sc.next();
mg[i][ni] = s.toCharArray();
}
}
search( mg, new Point( 0, 0, 0 ), t );
if( flag ) {
System.out.println( "YES" );
} else {
System.out.println( "NO" );
}
}
}
}
private static void search( char[][][] mg, Point point, int t ) {
if( !constraint( point, mg, t ) )
return;
if( mg[ point.c ][ point.n ][ point.m ] == '*' )
return;
if( mg[ point.c ][ point.n ][ point.m ] == 'P' ) {
flag = true;
}
if( mg[ point.c ][ point.n ][ point.m ] == '#' ) {
if( mg[ ( point.c + 1 ) % 2 ][ point.n ][ point.m ] == '#' || mg[ ( point.c + 1 ) % 2 ][ point.n ][ point.m ] == '*' ) {
return;
}
search( mg, new Point( ( point.c + 1 ) % 2, point.n, point.m ), t );
} else {
mg[ point.c ][ point.n ][ point.m ] = '*';
search( mg, new Point( point.c, point.n, point.m + 1 ), t - 1 );
search( mg, new Point( point.c, point.n, point.m - 1 ), t - 1 );
search( mg, new Point( point.c, point.n + 1, point.m ), t - 1 );
search( mg, new Point( point.c, point.n - 1, point.m ), t - 1 );
mg[ point.c ][ point.n ][ point.m ] = '.';
}
}
private static boolean constraint( Point point, char[][][] mg, int t ) {
if( point.n < 0 || point.n >= mg[ 0 ].length || point.m < 0 || point.m >= mg[ 0 ][ 0 ].length ) {
return false;
}
if( t < 0 ){
return false;
}
return true;
}
}
class Point {
public int c;
public int n;
public int m;
public Point( int c, int n, int m ) {
this.c = c;
this.n = n;
this.m = m;
}
}
[HDU 2102] A计划(搜索题,典型dfs or bfs)的更多相关文章
- 搜索分析(DFS、BFS、递归、记忆化搜索)
搜索分析(DFS.BFS.递归.记忆化搜索) 1.线性查找 在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素. (1)普通搜索方法,一个循环从0到10搜索,这里略. (2 ...
- HDU 2102 A计划(BFS/DFS走迷宫)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 2102 A计划
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸 ...
- HDU 2102 A计划(两层地图加时间限制加传送门的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others) Me ...
- HDU 2102 A计划 DFS与BFS两种写法 [搜索]
1.题意:一位公主被困在迷宫里,一位勇士前去营救,迷宫为两层,规模为N*M,迷宫入口为(0,0,0),公主的位置用'P'标记:迷宫内,'.'表示空地,'*'表示墙,特殊的,'#'表示时空传输机,走到这 ...
- hdu 2102 A计划(优先队列+dfs)
改了好久,上午来实验室打出来了,运行就是不对,一直找啊找!还是没找到,最后突然停电了,打好的代码还没保存呢! 刚才来的时候又重新打了一遍!!!结果一个小小的错误wrong了好久!!! 在dfs值返回时 ...
- HDU 2102 A计划 (BFS或DFS)
题意:中文题. 析:是一个简单的搜索,BFS 和 DFS都可行, 主要是这个题有一个坑点,那就是如果有一层是#,另一个层是#或者*,都是过不去的,就可以直接跳过, 剩下的就是一个简单的搜索,只不过是两 ...
- HDU 2102 A计划(DFS)
题目链接 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主 ...
- hdu 2102 a计划问题。。 双层dfs问题
Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长 ...
随机推荐
- Struts框架中struts-config.xml文件配置小结
弄清楚struts-config.xml中各项元素的作用,对于我们构建web项目有莫大的好处.<struts-config>是struts的根元素,它主要有8个子元素,DTD定义 如下: ...
- 超炫的时间轴jquery插件Timeline Portfolio
Timeline Portfolio是一款按时间顺序专业显示事件的jquery时间轴插件,可以根据时间的先后嵌入各种媒体包括微博,视频和地图等.这个展现的模式非常适合设计师的作品集和个人简历的展示.T ...
- css全局样式表
http://blog.csdn.net/baok1592/article/details/6448378
- Drawerlayou与ScrollView的介绍
Drawerlayout侧滑 Drawerlayout是Support Library包中实现了侧滑菜单效果的控件. 滚动条(ScrollView) ScrollView和HorizontalScro ...
- PROC UNIVARIATE过程
EDA(探索性数据分析)最常用的过程步之一就是PROC UNIVARIATE. 首先先看一个最简单的PROC UNIVARIATE程序: PROC UNIVARIATE DATA=SASHELP.FI ...
- Java虚拟机(JVM)默认字符集详解
Java中对字符串等进行转换字节数组时, 需要根据字符集编码来进行转换, 当不显示的指定字符集编码时(如: "测试".getBytes()), 会使用Charset.default ...
- shell编程其实真的很简单(四)
上篇我们学习了shell中条件选择语句的用法.接下来本篇就来学习循环语句.在shell中,循环是通过for, while, until命令来实现的.下面就分别来看看吧. for for循环有两种形式: ...
- TPS及计算方法
个事务,TPS为6 / 60s = 0.10 TPS.同时我们会知道事务的响应时间(或节拍),以此例,60秒完成6个事务也同时代表每个事务的响应时间或节拍为10秒. 利特尔法则 (Little' ...
- 百度云推送----iOS
前言 记录一下这几天学习的百度推送,觉得这个东西弄的还挺糟心的,好多注意的地方 正文 1.先申请一个百度开发者账号 http://push.baidu.com/fc 2.创建一个新应用,并应用配置 3 ...
- ubuntu ssh-keygen Permission denied
ubuntu下生成github上的ssh keys,执行: ssh-keygen 直接执行: sudo chown user1:user1 /home/user1/.ssh -R 成功生成.