Treasure of the Chimp Island

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 313    Accepted Submission(s): 151

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
 
应用时:15min
实际用时:2h31min+题解
原因:没完成代码就忘了
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=111;
char maz[maxn][maxn];
int n,m;
int vis[maxn][maxn][27];
const int inf=0x7ffffff;
class node{
public:
int x,y,t,p;
node(){x=y=t=p=0;}
node (int tx,int ty,int tt,int tp):x(tx),y(ty),t(tt),p(tp){}
bool operator <(const node & n2)const {
return t>n2.t;
}
};
int isdoor(int x,int y){
if(maz[x][y]=='#')return 0;
if(maz[x][y]>='A'&&maz[x][y]<='Z')return maz[x][y]-'A'+1;
return -1;
}
int isstone(int x,int y){
if(maz[x][y]>='0'&&maz[x][y]<='9')return maz[x][y]-'0';
return -1;
}
bool judge(int x,int y){
if(x>=0&&x<n&&y>=0&&y<m)return true;
return false;
}
void printmaz(){
printf("maz %d %d\n",n,m);
for(int i=0;i<n;i++)printf("%s\n",maz[i]);
}
priority_queue <node >que;
const int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
int bfs(){
while(!que.empty())que.pop();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(isdoor(i,j)!=-1){
que.push(node(i,j,0,isdoor(i,j)));
maz[i][j]='*';
}
}
}
while(!que.empty()){
node tp=que.top();que.pop();
//printf("pack x%d y%d t%d p%d\n",tp.x,tp.y,tp.t,tp.p);
for(int i=0;i<4;i++){
int tx=tp.x+dx[i],ty=tp.y+dy[i];
if(judge(tx,ty)){
if(maz[tx][ty]=='$')return tp.t;
else if(maz[tx][ty]=='.'){
if(vis[tx][ty][tp.p]==-1||vis[tx][ty][tp.p]>tp.t){
vis[tx][ty][tp.p]=tp.t;
que.push(node(tx,ty,tp.t,tp.p));
}
}
else if(isstone(tx,ty)!=-1){
if(vis[tx][ty][tp.p]==-1||vis[tx][ty][tp.p]>tp.t+isstone(tx,ty)){
vis[tx][ty][tp.p]=tp.t+isstone(tx,ty);
que.push(node(tx,ty,tp.t+isstone(tx,ty),tp.p));
}
if(tp.p>0&&(vis[tx][ty][tp.p-1]==-1||vis[tx][ty][tp.p-1]>tp.t)){
vis[tx][ty][tp.p-1]=tp.t;
que.push(node(tx,ty,tp.t,tp.p-1));
}
}
}
}
}
return inf;
}
int main(){
while(1){
for(n=0;(gets(maz[n]))&&strcmp(maz[n],"--")!=0&&strlen(maz[n])!=0;n++){}
if(strlen(maz[n])!=0)break;//in the end
m=strlen(maz[0]);
memset(vis,-1,sizeof(vis));
int ans;
ans=bfs();
if(ans!=inf)printf("%d\n",ans);
else puts("IMPOSSIBLE");
}
return 0;
}

  

快速切题 hdu2416 Treasure of the Chimp Island 搜索 解题报告的更多相关文章

  1. Treasure of the Chimp Island

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

  2. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  3. 【HDOJ】2416 Treasure of the Chimp Island

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

  4. LeetCode 463 Island Perimeter 解题报告

    题目要求 You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 rep ...

  5. 【LeetCode】463. Island Perimeter 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 减去相交部分 参考资料 日期 题目地址:https: ...

  6. 【模拟题(电子科大MaxKU)】解题报告【树形问题】【矩阵乘法】【快速幂】【数论】

    目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s ...

  7. 快速切题 sgu120. Archipelago 计算几何

    120. Archipelago time limit per test: 0.25 sec. memory limit per test: 4096 KB Archipelago Ber-Islan ...

  8. 快速切题 poj 2485 Highways prim算法+堆 不完全优化 难度:0

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23033   Accepted: 10612 Descri ...

  9. 快速切题sgu127. Telephone directory

    127. Telephone directory time limit per test: 0.25 sec. memory limit per test: 4096 KB CIA has decid ...

随机推荐

  1. noip2008 真题练习 2017.2.25

    不是有很多可以说的,记住不能边算边取min Code #include<iostream> #include<fstream> #include<sstream> ...

  2. fiddler配置及使用教程

    本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意:Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888.当Fiddler退出的时候它会 ...

  3. Python3基础 time 索引值访问元组中的年月日时分秒

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. arm linux下编译库System.Net.Primitives.dll和System.Xml.XmlSerializer.dll

    1.环境: /home/jello # uname -aLinux  3.10.0 #2 SMP Mon Mar 6 17:52:09 CST 2017 armv7l GNU/Linux 2.获取mo ...

  5. C#学习笔记(八):多维数组

    一维数组 冒泡排序 二维数组 Length:取数组元素的总个数 GetLength:取不同维度的个数 using System; using System.Collections.Generic; u ...

  6. javascript版的quine程序-返回自身源码

    引用自Wikipedia: 一个quine是一个计算机程序,它不接受任何输入,且唯一的输出就是自身的源代码. @cowboy (Ben Alman) 给出了一个用JavaScript写的quine程序 ...

  7. [.NET开发] C# 如何创建Excel多级分组

    要设置显示或者隐藏分类数据下的详细信息,在便于数据查看.管理的同时也使文档更具美观性.那么,在C#中如何来创建Excel数据的多级分组显示呢?下面将进行详细阐述.方法中使用了免费版组件Free Spi ...

  8. [.NET开发] C# 合并、拆分PDF文档

    在整理文件时,将多个同类型文档合并是实现文档归类的有效方法,也便于文档管理或者文档传输.当然,也可以对一些比较大的文件进行拆分来获取自己想要的部分文档.可以任意地对文档进行合并.拆分无疑为我们了提供极 ...

  9. English trip -- VC(情景课)10 C I like to watch TV. 我爱看电视

    Grammar focus 语法点: like to do    you do    they What  does  he    like to do? does  she Practice 练习 ...

  10. 【异常】Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around

    原因:缺少aspect,AOP的maven坐标 导入maven坐标: <dependency> <groupId>org.springframework</groupId ...