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
*****#*********
*.1....4..$...*
*..***..2.....*
*..2..*****..2*
*..3..******37A
*****9..56....*
*.....******..*
***CA********** *****
*$3**
*.2**
***#* --
 
Sample Output
1
IMPOSSIBLE
 
 
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的更多相关文章

  1. 快速切题 hdu2416 Treasure of the Chimp Island 搜索 解题报告

    Treasure of the Chimp Island Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  2. 【HDOJ】2416 Treasure of the Chimp Island

    bfs().题目的数据乱码.应该如下: *****#********* *.......$...* *..***.......* *....*****..* *....******37A *****. ...

  3. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  4. Gym 100971A Treasure Island BFS 思维题

    A - Treasure Island Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  5. D. Treasure Island

    D. Treasure Island dfs大法好== 写半天bfs疯狂MLE dfs标记掉路上的一些点 然后再跑一遍dfs #include<bits/stdc++.h> using n ...

  6. [Codeforces 1214D]Treasure Island(dfs)

    [Codeforces 1214D]Treasure Island(dfs) 题面 给出一个n*m的字符矩阵,'.'表示能通过,'#'表示不能通过.每步可以往下或往右走.问至少把多少个'.'变成'#' ...

  7. Treasure Island DFS +存图

    All of us love treasures, right? That's why young Vasya is heading for a Treasure Island. Treasure I ...

  8. 【Gym 100971A】Treasure Island

    题意 题目链接给你一个地图,'#'代表水,'.'代表陆地,'?'代表擦去的地图,可能是'#'也可能是'.'.地图中本该只有一块相连的陆地,若只有一种方案则输出确定的地图.若有多种方案,则输出‘Ambi ...

  9. Codeforces 106D Treasure Island 预处理前缀+暴力(水

    主题链接:点击打开链接 意甲冠军: 特定n*m矩阵 # 是墙 . 和字母是平地 最多有26个字母(不反复出现) 以下k个指令. 每一个指令代表移动的方向和步数. 若以某个字母为起点,依次运行全部的指令 ...

随机推荐

  1. datepickerpopup时间限制选取

    使用popup组件的过程中遇到时间选取的问题 官方文档大致说使用date和mode 可以解决,奈何老夫是看不懂,写的时候参考的有 官方文档.echo2016的博文.liumang361的博文 先看图 ...

  2. PHP实现页面静态化

    1.通过buffer来实现   需要用file_put_contents ob_get_clean()等内置函数   ob_start (); include "filterpost.htm ...

  3. 【个人笔记】《知了堂》MySQL三种关系:一对一,一对多,多对多。

    一对一:比如一个学生对应一个身份证号.学生档案: 一对多:一个班可以有很多学生,但是一个学生只能在一个班: 多对多:一个班可以有很多学生,学生也可以有很多课程: 一对多关系处理: 我们以学生和班级之间 ...

  4. [C#]关于DBNULL的解释

    1   概述 如下例子,你觉得有什么问题?如你能很快的找出问题,并且解决它,那么你可以跳过本篇文章,谢谢~~. List<Base_Employee> ltPI = new List< ...

  5. 一步一步带你做WebApi迁移ASP.NET Core2.0

    随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...

  6. Java子线程中的异常处理(通用)

    在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了.那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相 ...

  7. "HK"日常之用C# Process写一只小病毒

    众所周知,Process可以启动和关闭电脑上的进程,命名空间位于 System.Diagnostics,本次的教程就是利用其中的GetProcesses和Kill方法来实现的. 一.编码工作 首先我们 ...

  8. Java并发/多线程系列——初识篇

    回到过去,电脑有一个CPU,一次只能执行一个程序.后来多任务处理意味着计算机可以同时执行多个程序(AKA任务或进程).这不是真的"同时".单个CPU在程序之间共享.操作系统将在运行 ...

  9. spring 内部工作机制(二)

    本章节讲Spring容器从加载配置文件到创建出一个完整Bean的作业流程及参与的角色. Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表, ...

  10. 用sed实现wc -c的功能

    sed是所谓的流编辑器,我们经常用它来做一些文本替换的事情,这是sed最擅长的事情,如sed 's/Bob/Tom/g'就是把文章中所有的Bob改成Tom. sed是图灵完备的,作为sed的粉丝,喜欢 ...