• 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
    *****#*********
    *.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][30];
    int n,m;
    int cur=INF;
    int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
    bool ok(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m&&mapn[x][y]!='*')
            return true;
        return false;
    }
    void bfs(priority_queue<node>q)
    {
        memset(vis,-1,sizeof vis);
        //cout<<q.size()<<endl;
        int c=0;
        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=0;i<4;i++)
            {
                int fx=fr.x+dir[i][0];
                int fy=fr.y+dir[i][1];
                if(!ok(fx,fy)) continue;
                if(mapn[fx][fy]=='.')//是路
                {
                    if(vis[fx][fy][fr.v]==-1||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]>='1'&&mapn[fx][fy]<='9')//数字
                {
                    if(fr.v>0&&(vis[fx][fy][fr.v-1]==-1||vis[fx][fy][fr.v-1]>fr.step))//
                    {
                        q.push(node(fx,fy,fr.v-1,fr.step));
                        vis[fx][fy][fr.v-1]=fr.step;
                    }
                    if(vis[fx][fy][fr.v]==-1||vis[fx][fy][fr.v]>(fr.step+mapn[fx][fy]-'0'))//不炸
                    {
                        q.push(node(fx,fy,fr.v,(fr.step+mapn[fx][fy]-'0')));
                        vis[fx][fy][fr.v]=fr.step+mapn[fx][fy]-'0';
                    }
                }
                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=0;
        priority_queue<node>q;
        while(gets(mapn[n++]))
        {
            //cout<<mapn[n-1]<<endl;
            for(int i=0;mapn[n-1][i];i++)
            {
                if(mapn[n-1][i]=='#')
                {
                    q.push(node(n-1,i,0,0));
                }
                else if(mapn[n-1][i]>='A'&&mapn[n-1][i]<='Z')
                {
                    q.push(node(n-1,i,mapn[n-1][i]-'A'+1,0));
                }
            }
            if(mapn[n-1][0]=='-')
                break;
            if(strcmp(mapn[n-1],"")==0)
            {
                cur=INF;
                m=strlen(mapn[0]);
                n--;
                //cout<<n<<" "<<m<<endl;
                bfs(q);
                //cout<<q.size()<<endl;
                //cout<<"cur="<<cur<<endl;
                if(cur==INF)
                    puts("IMPOSSIBLE");
                else
                    printf("%d
    ",cur);
                n=0;
                while(!q.empty()) q.pop();
            }
        }
        return 0;
    }
  • 相关阅读:
    远程监控基础知识和故障排除
    感慨颇多
    物联网操作系统Hello China移植mile stone之一:移植基础版本V1.76发布
    iOS5系统API和5个开源库的JSON解析速度测试
    (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0)
    [工具]Mac平台开发几个网络抓包工具(sniffer)
    [工具]Mac下非常好用的快捷终端Dterm
    【IOS】在SDK中打开其他接入应用的解决方案
    [开源]在iOS上实现Android风格的控件Toast
    [技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6065663.html
Copyright © 2020-2023  润新知