快速切题 hdu2416 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): 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

2006 Asia Regional Tehran

应用时: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;
}

  

时间: 2024-11-03 01:18:45

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

LeetCode 463 Island Perimeter 解题报告

题目要求 You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one

快速切题 cf118A

这教导人们一定要看题,要看题,元音包含了‘y’,完毕,要看题啊 #include <cstring> #include <cstdio> #include <cctype> using namespace std; char buff[1001]; int main(){ scanf("%s",buff); for(int i=0;buff[i];i++){ buff[i]=tolower(buff[i]); if(buff[i]=='a'||buf

快速切题 poj2488 A Knight&#39;s Journey

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31195   Accepted: 10668 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

快速切题 poj3026

感受到出题人深深的~恶意 这提醒人们以后...数字后面要用gets~不要getchar 此外..不要相信那个100? Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8524   Accepted: 2872 Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant o

快速切题 poj 2485 Highways prim算法+堆 不完全优化

Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23033   Accepted: 10612 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Fl

快速切题 acdream手速赛(6)A-C

Sudoku Checker Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description Sudoku is a popular single player game. The objective is to fill a 9x9 matrix with digits so that each colu

快速切题 poj1068

Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19716   Accepted: 11910 Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways: q By an integer sequence P = p1 p2...pn

快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1

112. a^b-b^a time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given natural numbers a and b. Find a^b-b^a. Input Input contains numbers a and b (1≤a,b≤100). Output Write answer to output. Sample Input 2 3Sample Output -1 import j

快速切题 poj 2993 Emag eht htiw Em Pleh 模拟

Emag eht htiw Em Pleh Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2806   Accepted: 1865 Description This problem is a reverse case of the problem 2996. You are given the output of the problem H and your task is to find the correspond