openjudge 4116:拯救行动

传送门

总时间限制: 
1000ms

内存限制: 
65536kB
描述

公主被恶人抓走,被关押在牢房的某个地方。牢房用N*M (N, M <= 200)的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。 
英勇的骑士(r)决定孤身一人去拯救公主(a)。我们假设拯救成功的表示是“骑士到达了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守卫,骑士一旦遇到守卫,必须杀死守卫才能继续前进。 
现假设骑士可以向上、下、左、右四个方向移动,每移动一个位置需要1个单位时间,杀死一个守卫需要花费额外的1个单位时间。同时假设骑士足够强壮,有能力杀死所有的守卫。

给定牢房矩阵,公主、骑士和守卫在矩阵中的位置,请你计算拯救行动成功需要花费最短时间。

输入
第一行为一个整数S,表示输入的数据的组数(多组输入)
随后有S组数据,每组数据按如下格式输入 
1、两个整数代表N和M, (N, M <= 200). 
2、随后N行,每行有M个字符。"@"代表道路,"a"代表公主,"r"代表骑士,"x"代表守卫, "#"代表墙壁。
输出
如果拯救行动成功,输出一个整数,表示行动的最短时间。
如果不可能成功,输出"Impossible"
样例输入
2
7 8
#@#####@
#@a#@@[email protected]
#@@#[email protected]@@
@@#@@#@#
#@@@##@@
@#@@@@@@
@@@@@@@@
13 40
@[email protected]@##[email protected]#[email protected]#xxxx##@#[email protected]@@#x#@#x#@@[email protected]#@x
xx###[email protected]#@@##[email protected]@@#@[email protected]@#[email protected]@@#[email protected]#[email protected]@[email protected]
#@x#@x#x#@@##@@x#@xx#[email protected]@x##@@@#@[email protected]@[email protected]
@##[email protected]@@x#xx#@@#xxxx#@@[email protected]@#@[email protected]@@[email protected]#@#[email protected]#
@#xxxxx##@@x##[email protected]@@#[email protected]####@@@x#x##@#@
#xxx#@#x##[email protected]@#[email protected]@@[email protected]#@#[email protected]#####
#[email protected]#@[email protected]@@@##@x#xx#[email protected]#xx#@#####x#@x
xx##@#@x##x##x#@x#@a#[email protected]##@#@##[email protected]#@@[email protected]
x#x#@[email protected]#x#@##@[email protected]#[email protected]##x##xx#@#[email protected]@
#[email protected]@#@###x##[email protected]#@@#@@[email protected]@@[email protected]@@@##@@[email protected]@x
x#[email protected]###@xxx#@#x#@@###@#@##@x#@[email protected]#@@#@@
#@#[email protected]#x#x###@[email protected]@xxx####[email protected]##@x####xx#@x
#x#@x#x######@@#[email protected]#xxxx#[email protected]@@#xx#x#####@
样例输出
13
7

【思路】广搜+优先队列维护错误:结构体忘记写比较函数,优先队列里定义的是Node【code】
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
int endx,endy,strx,stry,t,n,m;
char map[201][201];
int dx[4]={0,0,1,-1},
    dy[4]={1,-1,0,0};
int b[201][201];
int ans;
struct node
{
    int x,y,val;
    bool operator < (const node a) const
    {
        return a.val<val;
     }
};
priority_queue<node>q;

int bfs(int x,int y)
{

    while(!q.empty())
    {
        node now=q.top();q.pop();
        for(int i=0;i<4;i++)
        {
            int xx=now.x+dx[i],yy=now.y+dy[i];
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&!b[xx][yy])
            {
                if(map[xx][yy]==‘x‘)
                {
                    b[xx][yy]=1;
                    q.push((node){xx,yy,now.val+2});
                }
                if(map[xx][yy]==‘@‘)
                {
                    b[xx][yy]=1;
                    q.push((node){xx,yy,now.val+1});
                }
                if(xx==endx&&yy==endy)
                {
                    ans=now.val+1;
                    return 1;
                }
            }
        }
    }
    return 0;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        memset(b,0,sizeof(b));
        scanf("%d%d",&n,&m);
        while(!q.empty())q.pop();
        for(int i=0;i<n;i++)
        {
            scanf("%s",map[i]);
            for(int j=0;j<m;j++)
            {
               if(map[i][j]==‘r‘)
                {
                    strx=i;stry=j;
                }
                if(map[i][j]==‘a‘)
                {
                    endx=i;endy=j;
                }
            }
        }
        q.push((node){strx,stry,0});
        if(bfs(strx,stry))printf("%d\n",ans);
        else printf("Impossible\n");
    }
    return 0;
}

时间: 2024-08-26 01:33:42

openjudge 4116:拯救行动的相关文章

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

从巴铁看,非法集资毁掉创新后还有办法拯救吗?

近日,一桩引人注目的非法集资案成为媒体头条.北京公安局东城分局发布的消息显示,针对投资人举报北京华赢凯来资产管理有限公司从事非法集资活动的情况,东城分局依法立案侦查,先后将白志明等32名犯罪嫌疑人抓获归案.而这家涉案公司,正是秦皇岛"巴铁1号试验车"项目的出资公司. 原本"巴铁1号"是创新的代表案例,在此前引发诸多轰动.但让人没想到的是,最终却成为非法集资的一个噱头.而从长远来看,非法集资毁掉的不仅仅是"巴铁1号",更是投资者和大众对创新的信心.

拯救OIBH总部

拯救OIBH总部 area [题目描述]: OIBH总部突然被水淹没了!现在OIBH需要你的救援…… OIBH被突来的洪水淹没了>.<还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由"0"表示)有多少. [输入描述]: 第一行是两个数,x和y(x,y<=500) 第二行及以下是一个由*和0组成的x*y的图. [输出描述]: 输出没被水淹没的OIBH总部的“

悬崖上的颤抖与反思 -- 能拯救我们的只有我们自己

1,大盘连续跳水 从刚开始第一周的盈利3K多,到后来持续亏损,再加上大盘不断跳水,到目前为止已经亏损本金2/5,亏损达到了16.5W,有2支股票割肉了,损失在界面上不再显示出来,如下所示: 2,在歧路上越走越远 刚才开始,投入了6W资金,后来群里酱油说到他专攻重组类型的,并且重点关注4支, 重组类型: 孚日股份. 002083 新赛股份. 600540 天利高新. 600339 嘉麟杰       002486 所以,我又转入资金15W,买入以上4支股票,后来室友的中天城投和黔源电力也赚钱,他们

Poj OpenJudge 1068 Parencodings

1.Link: http://poj.org/problem?id=1068 http://bailian.openjudge.cn/practice/1068 2.Content: Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20077   Accepted: 12122 Description Let S = s1 s2...s2n be a well-formed string of p

OpenJudge 2721 忽略大小写比较字符串大小

1.Link: http://bailian.openjudge.cn/practice/2721/ 2.Content: 总时间限制: 1000ms 内存限制: 65536kB 描述 一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同 的字符或遇到'\0'为止.如果全部字符都相同,则认为相同:如果出现不相同的字符,则以第一个不相同的字符的比较结果为准.但在有些时候,我们比较字符 串的大小时,希望忽略字母的大小,例

一次U盘拯救的经历

U盘拷资料,突然就弹出框框,复制终止了,然后U盘里面的只是编程可读的了. 倒是没有啥重要的资料,就是只有这一个U盘了,平时传资料都靠它,不能就这么垮了啊,于是就来了一次拯救行动. 一共有三个步骤 第一步:利用chipgenius来检测主控厂商和主控型号 第二步:根据找到的主控厂商和主控型号找到对应的U盘量产工具 这里在网上找,一找一大把.然后我就根据我的U盘的型号找到了对应的量产工具. 做出如图所示选择,然后设置和U盘相关的必要信息: 第三步:保存之后然后,导入之前保存的设置,KINGSTON.

bzoj3007: 拯救小云公主

Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务. 但他不死心,他在想,能不能避开boss去拯救公主呢,嘻嘻. Boss的洞穴可以看成一个矩形,英雄在左下角(1,1),公主在右上角(row,line).英雄为了避开boss,当然是离boss距离越远越好了,所以英雄决定找一条路径使到距离bo

openjudge 大师兄,师傅被妖怪抓走啦

描述 孙悟空听到沙僧大喊一句:“大师兄,师傅被妖怪抓走啦!”于是孙悟空直追白骨精而去.孙悟空在一条长度为L的森林小路上飞奔,上面有L+1个整点,依次为0,1,2……L.白骨精会使用一种大范围的攻击法术,产生N个能量球,其中第i个能量球的能量值为f[i],落在小路的整点k[i]上.当孙悟空的位置离能量球i的距离为s时,会受到f[i]-s的伤害,如果f[i]-s计算出的伤害为负值,则判定为0.孙悟空虽然救师心切,但也不能葬身于白骨精的法术之中,因此他想知道应该躲在哪一个整点处,才能让自己受到的总伤害