hdu---------(1026)Ignatius and the Princess I(bfs+dfs)
Ignatius and the Princess I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12124 Accepted Submission(s): 3824 Special Judge
Problem Description
The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166's castle. The castle is a large labyrinth. To make the problem simply, we assume the labyrinth is a N*M two-dimensional array which left-top corner is (0,0) and right-bottom corner is (N-1,M-1). Ignatius enters at (0,0), and the door to feng5166's room is at (N-1,M-1), that is our target. There are some monsters in the castle, if Ignatius meet them, he has to kill them. Here is some rules: 1.Ignatius can only move in four directions(up, down, left, right), one step per second. A step is defined as follow: if current position is (x,y), after a step, Ignatius can only stand on (x-1,y), (x+1,y), (x,y-1) or (x,y+1). 2.The array is marked with some characters and numbers. We define them like this: . : The place where Ignatius can walk on. X : The place is a trap, Ignatius should not walk on it. n : Here is a monster with n HP(1<=n<=9), if Ignatius walk on it, it takes him n seconds to kill the monster. Your task is to give out the path which costs minimum seconds for Ignatius to reach target position. You may assume that the start position and the target position will never be a trap, and there will never be a monster at the start position.
Input
The input contains several test cases. Each test case starts with a line contains two numbers N and M(2<=N<=100,2<=M<=100) which indicate the size of the labyrinth. Then a N*M two-dimensional array follows, which describe the whole labyrinth. The input is terminated by the end of file. More details in the Sample Input.
Output
For each test case, you should output "God please help our poor hero." if Ignatius can't reach the target position, or you should output "It takes n seconds to reach the target position, let me show you the way."(n is the minimum seconds), and tell our hero the whole path. Output a line contains "FINISH" after each test case. If there are more than one path, any one is OK in this problem. More details in the Sample Output.
Sample Input
5 6 .XX.1. ..X.2. 2...X. ...XX. XXXXX. 5 6 .XX.1. ..X.2. 2...X. ...XX. XXXXX1 5 6 .XX... ..XX1. 2...X. ...XX. XXXXX.
Sample Output
It takes 13 seconds to reach the target position, let me show you the way. 1s:(0,0)->(1,0) 2s:(1,0)->(1,1) 3s:(1,1)->(2,1) 4s:(2,1)->(2,2) 5s:(2,2)->(2,3) 6s:(2,3)->(1,3) 7s:(1,3)->(1,4) 8s:FIGHT AT (1,4) 9s:FIGHT AT (1,4) 10s:(1,4)->(1,5) 11s:(1,5)->(2,5) 12s:(2,5)->(3,5) 13s:(3,5)->(4,5) FINISH It takes 14 seconds to reach the target position, let me show you the way. 1s:(0,0)->(1,0) 2s:(1,0)->(1,1) 3s:(1,1)->(2,1) 4s:(2,1)->(2,2) 5s:(2,2)->(2,3) 6s:(2,3)->(1,3) 7s:(1,3)->(1,4) 8s:FIGHT AT (1,4) 9s:FIGHT AT (1,4) 10s:(1,4)->(1,5) 11s:(1,5)->(2,5) 12s:(2,5)->(3,5) 13s:(3,5)->(4,5) 14s:FIGHT AT (4,5) FINISH God please help our poor hero. FINISH
Author
Ignatius.L
简单的搜索题: 记录路径额搜索...
代码:
1 /*Problem : 1026 ( Ignatius and the Princess I ) Judge Status : Accepted
2 RunId : 11510650 Language : G++ Author : huifeidmeng
3 Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta*/
4
5 #include<cstring>
6 #include<cstdio>
7 #include<cstdlib>
8 #include<queue>
9 #include<iostream>
10 using namespace std;
11 const int maxn=101;
12 struct node{
13 int x,y;
14 };
15 struct sode{
16 int val;
17 int sum;
18 node pre; //他一个点
19 void setint(int x,int y){
20 pre.x=x;
21 pre.y=y;
22 }
23 };
24 int n,m,cont;
25 sode map[maxn][maxn];
26 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
27 void bfs(){
28 queue<node> anc;
29 node tem={0,0};
30 anc.push(tem);
31 while(!anc.empty()){
32 node sav=anc.front();
33 anc.pop();
34 for(int i=0;i<4;i++){
35 tem=(node){dir[i][0]+sav.x,dir[i][1]+sav.y};
36 if(tem.x>=0&&tem.x<n&&tem.y>=0&&tem.y<m&&map[tem.x][tem.y].val!=-1){
37 if(map[tem.x][tem.y].sum==0
38 ||map[tem.x][tem.y].sum>map[sav.x][sav.y].sum+map[tem.x][tem.y].val+1)
39 {
40 map[tem.x][tem.y].sum=map[sav.x][sav.y].sum+map[tem.x][tem.y].val+1;
41 map[tem.x][tem.y].setint(sav.x,sav.y);
42 anc.push(tem);
43 }
44 }
45 }
46 }
47 }
48 void dfs(sode a,node cur){
49 if(cur.x==0&&cur.y==0){
50 cont=1;
51 while(map[cur.x][cur.y].val-->0)
52 printf("%ds:FIGHT AT (%d,%d)n",cont++,cur.x,cur.y);
53 // printf("%ds:(%d,%d)->(%d,%d)n",cont++,a.pre.x,a.pre.y,cur.x,cur.y);
54 return;
55 }
56 dfs(map[a.pre.x][a.pre.y],a.pre);
57 printf("%ds:(%d,%d)->(%d,%d)n",cont++,a.pre.x,a.pre.y,cur.x,cur.y);
58 if(a.val>0){
59 while(a.val-->0){
60 printf("%ds:FIGHT AT (%d,%d)n",cont++,cur.x,cur.y);
61 }
62 }
63 }
64 int main(){
65 char ss[105];
66 //freopen("test.in","r",stdin);
67 // freopen("test.out","w",stdout);
68 while(scanf("%d%d",&n,&m)!=EOF){
69 for(int i=0;i<n;i++){
70 scanf("%s",ss);
71 for(int j=0;j<m;j++){
72 map[i][j].sum=0;
73 map[i][j].setint(0,0);
74 if(ss[j]=='.') map[i][j].val=0;
75 else if(ss[j]=='X')map[i][j].val=-1;
76 else{
77 map[i][j].val= ss[j]-'0';
78 if(i+j==0)map[i][j].sum=map[i][j].val;
79 }
80 }
81 }
82 bfs();
83 if(map[n-1][m-1].pre.x==0)
84 printf("God please help our poor hero.n");
85 else {
86 printf("It takes %d seconds to reach the target position, let me show you the way.n",map[n-1][m-1].sum);
87 dfs(map[n-1][m-1],(node){n-1,m-1});
88 }
89 puts("FINISH");
90 }
91 return 0;
92 }
- 如何使用java代码通过JDBC访问Sentry环境下的Hive
- 如何为HttpFS服务配置SSL
- 如何使用Java访问集成OpenLDAP并启用Sentry的Impala和Hive
- 如何向Hive表加载数据
- 如何使用Spark Streaming读取HBase的数据并写入到HDFS
- Hive Load本地数据文件异常分析
- 使用Java代码通过JDBC连接只启用Sentry的Impala异常分析
- 如何在CDSW中定制Docker镜像
- 干货:排名前 16 的 Java 工具类!
- 危险:会话固定攻击漏洞,你们的系统都堵上了吗?
- 深度学习入门者必看:25个你一定要知道的概念
- 如何在CM中启用YARN的使用率报告
- 如何修改CDSW服务的DNS和HOSTNAME
- 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入分析Volatile的实现原理
- Java Collection Framework : List
- String类的equals方法
- 必须同时重写hashcode和equals方法的原因
- Springboot中使用Redis的发布/订阅模式
- Java 几种排序算法 与时间空间复杂度
- JAVA程序员必须要学会的网络知识
- 计算机网络学习--数据链路层
- 带你快速了解原码、反码、补码,搞定进制转换
- Python语言学习笔记——简介
- 三行代码,OpenCV轻松生成19种色彩风格图像
- Java对象的结构与对象在内存中的结构
- Spring框架源码分析(IoC):Resource、ResourceLoader和容器之间的关系
- Spring框架源码分析(IoC):BeanFactory和ApplicationContext容器家族
- spring框架通过xml以及注解方式注册BeanDefinition的流程全链路分析