Treasure of the Chimp Island
Treasure of the Chimp Island |
| Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
| Total Submission(s): 207 Accepted Submission(s): 84 |
|
Problem Description
Bob Bennett, the young adventurer, has found the map to the treasure of the Chimp Island, where the ghost zombie pirate LeChimp, the infamous evil pirate of the Caribbeans has hidden somewhere inside the Zimbu Memorial Monument (ZM2). ZM2 is made up of a number of corridors forming a maze. To protect the treasure, LeChimp has placed a number of stone blocks inside the corridors to block the way to the treasure. The map shows the hardness of each stone block which determines how long it takes to destroy the block. ZM2 has a number of gates on the boundary from which Bob can enter the corridors. Fortunately, there may be a pack of dynamites at some gates, so that if Bob enters from such a gate, he may take the pack with him. Each pack has a number of dynamites that can be used to destroy the stone blocks in a much shorter time. Once entered, Bob cannot exit ZM2 and enter again, nor can he walk on the area of other gates (so, he cannot pick more than one pack of dynamites).
The hardness of the stone blocks is an integer between 1 and 9, showing the number of days required to destroy the block. We neglect the time required to travel inside the corridors. Using a dynamite, Bob can destroy a block almost immediately, so we can ignore the time required for it too. The problem is to find the minimum time at which Bob can reach the treasure. He may choose any gate he wants to enter ZM2. |
|
Input
The input consists of multiple test cases. Each test case contains the map of ZM2 viewed from the above. The map is a rectangular matrix of characters. Bob can move in four directions up, down, left, and right, but cannot move diagonally. He cannot enter a location shown by asterisk characters (*), even using all his dynamites! The character ($) shows the location of the treasure. A digit character (between 1 and 9) shows a stone block of hardness equal to the value of the digit. A hash sign (#) which can appear only on the boundary of the map indicates a gate without a dynamite pack. An uppercase letter on the boundary shows a gate with a pack of dynamites. The letter A shows there is one dynamite in the pack, B shows there are two dynamite in the pack and so on. All other characters on the boundary of the map are asterisks. Corridors are indicated by dots (.). There is a blank line after each test case. The width and the height of the map are at least 3 and at most 100 characters. The last line of the input contains two dash characters (--).
|
|
Output
For each test case, write a single line containing a number showing the minimum number of days it takes Bob to reach the treasure, if possible. If the treasure is unreachable, write IMPOSSIBLE.
|
|
Sample Input
*****#********* |
|
Sample Output
1 |
|
Source
2006 Asia Regional Tehran
|
|
Recommend
lcy
|
/*
地宫的四周不是*的位置是地宫的入口,有炸 药数,地图中有相应的数字炸 药,可以选择炸还是不炸
取得宝藏的最小时间 遇到石头将炸还是不炸的情况都加到队列中;
然后爆搜
*/
#include<bits/stdc++.h>
#define N 105
#define INF 0x3f3f3f3f
using namespace std;
struct node
{
int x,y,v,step;
node(){}
node(int a,int b,int c,int d)
{
x=a;
y=b;
v=c;
step=d;
}
bool operator <(const node &b) const
{
return step>b.step;
}
};
char mapn[N][N];
int vis[N][N][];
int n,m;
int cur=INF;
int dir[][]={{,},{-,},{,-},{,}};
bool ok(int x,int y)
{
if(x>=&&x<n&&y>=&&y<m&&mapn[x][y]!='*')
return true;
return false;
}
void bfs(priority_queue<node>q)
{
memset(vis,-,sizeof vis);
//cout<<q.size()<<endl;
int c=;
while(!q.empty())
{
//cout<<q.size()<<endl;
node fr=q.top();
q.pop();
vis[fr.x][fr.y][fr.v]=fr.step;
for(int i=;i<;i++)
{
int fx=fr.x+dir[i][];
int fy=fr.y+dir[i][];
if(!ok(fx,fy)) continue;
if(mapn[fx][fy]=='.')//是路
{
if(vis[fx][fy][fr.v]==-||vis[fx][fy][fr.v]>fr.step)
{
q.push(node(fx,fy,fr.v,fr.step));
vis[fx][fy][fr.v]=fr.step;
}
}
else if(mapn[fx][fy]>=''&&mapn[fx][fy]<='')//数字
{
if(fr.v>&&(vis[fx][fy][fr.v-]==-||vis[fx][fy][fr.v-]>fr.step))//炸
{
q.push(node(fx,fy,fr.v-,fr.step));
vis[fx][fy][fr.v-]=fr.step;
}
if(vis[fx][fy][fr.v]==-||vis[fx][fy][fr.v]>(fr.step+mapn[fx][fy]-''))//不炸
{
q.push(node(fx,fy,fr.v,(fr.step+mapn[fx][fy]-'')));
vis[fx][fy][fr.v]=fr.step+mapn[fx][fy]-'';
}
}
else if(mapn[fx][fy]=='$'&&fr.step<cur)//找到宝藏
{
cur=fr.step; }
}
}
//cout<<"cur="<<cur<<endl;
}
int main()
{
//freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin);
n=;
priority_queue<node>q;
while(gets(mapn[n++]))
{
//cout<<mapn[n-1]<<endl;
for(int i=;mapn[n-][i];i++)
{
if(mapn[n-][i]=='#')
{
q.push(node(n-,i,,));
}
else if(mapn[n-][i]>='A'&&mapn[n-][i]<='Z')
{
q.push(node(n-,i,mapn[n-][i]-'A'+,));
}
}
if(mapn[n-][]=='-')
break;
if(strcmp(mapn[n-],"")==)
{
cur=INF;
m=strlen(mapn[]);
n--;
//cout<<n<<" "<<m<<endl;
bfs(q);
//cout<<q.size()<<endl;
//cout<<"cur="<<cur<<endl;
if(cur==INF)
puts("IMPOSSIBLE");
else
printf("%d\n",cur);
n=;
while(!q.empty()) q.pop();
}
}
return ;
}
Treasure of the Chimp Island的更多相关文章
- 快速切题 hdu2416 Treasure of the Chimp Island 搜索 解题报告
Treasure of the Chimp Island Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- 【HDOJ】2416 Treasure of the Chimp Island
bfs().题目的数据乱码.应该如下: *****#********* *.......$...* *..***.......* *....*****..* *....******37A *****. ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- Gym 100971A Treasure Island BFS 思维题
A - Treasure Island Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- D. Treasure Island
D. Treasure Island dfs大法好== 写半天bfs疯狂MLE dfs标记掉路上的一些点 然后再跑一遍dfs #include<bits/stdc++.h> using n ...
- [Codeforces 1214D]Treasure Island(dfs)
[Codeforces 1214D]Treasure Island(dfs) 题面 给出一个n*m的字符矩阵,'.'表示能通过,'#'表示不能通过.每步可以往下或往右走.问至少把多少个'.'变成'#' ...
- Treasure Island DFS +存图
All of us love treasures, right? That's why young Vasya is heading for a Treasure Island. Treasure I ...
- 【Gym 100971A】Treasure Island
题意 题目链接给你一个地图,'#'代表水,'.'代表陆地,'?'代表擦去的地图,可能是'#'也可能是'.'.地图中本该只有一块相连的陆地,若只有一种方案则输出确定的地图.若有多种方案,则输出‘Ambi ...
- Codeforces 106D Treasure Island 预处理前缀+暴力(水
主题链接:点击打开链接 意甲冠军: 特定n*m矩阵 # 是墙 . 和字母是平地 最多有26个字母(不反复出现) 以下k个指令. 每一个指令代表移动的方向和步数. 若以某个字母为起点,依次运行全部的指令 ...
随机推荐
- 以下内容对于灵活修改textField中文本以及占位文本属性进行了完整的封装,加入项目中可以节约开发时间。
textField对占位文本设置属性有限,在项目中需要改变占位文本的属性以及位置,需要自己对控件进行封装 封装方法如下: 在LDTextField.m 文件中: #import <UIKit/U ...
- GCD之after
先介绍下C中的modf函数 函数名:modf 头文件:<math.h> 函数原型:double modf(double x, double *ipart) 函数用途:分解x,以得到x的整数 ...
- 新旧apache HttpClient 获取httpClient方法
在apache httpclient 4.3版本中对很多旧的类进行了deprecated标注,通常比较常用的就是下面两个类了. DefaultHttpClient -> CloseableHtt ...
- css左右布局的几种实现方式和优缺点
记录一下左右布局的实现方式,实现的具体效果是,左侧固定宽度,高度适中等于父元素的高度,父元素的高度由右侧内容决定: html代码如下: <div class="parent" ...
- oracle 表查询(一)
通过scott用户下的表来演示如何使用select语句,接下来对emp.dept.salgrade表结构进行解说. emp 雇员表字段名称 数据类型 是否为空 备注-------- ...
- 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数
目录: » plot 最常用的二维曲线绘图函数 > 帮助文档 > 基本使用语法 > 线条的样式.符号和颜色调整 > 图形属性调整 > 使用图形句柄进行设置 » ...
- window、linux系统与linux服务器之间使用svn同步及自动部署代码的方法
摘要: 在家用PC,在公司用办公电脑对一个项目的代码进行修改时,会遇到代码同步的问题.本文讲解了代码同步及自动部署的解决办法. 实现方法: 1.首先在linux服务器上和linux上安装svn(sud ...
- 如何用java语言获取某个网页的源代码
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; public class W ...
- Mysq基础
本文是之前看博客时候的记录,忘记是哪位仁兄的了,在这只做一次转载: 常见误区 count(1)和count(primary_key) 优于 count(*) 很多人为了统计记录条数,就使用 count ...
- PHP多进程编之僵尸进程问题
上一篇说到了使用pcntl_fork函数可以让PHP实现多进程并发或者异步处理的效果.那么问题是我们产生的进程需要去控制,而不能置之不理.最基本的方式就是fork进程和杀死进程. 通过利用pcntl_ ...