AC日记——逃出克隆岛 (bfs)

2059 逃出克隆岛

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题解

题目描述 Description

oi小组的yh酷爱玩魔兽rpg,每天都会在u9搜索最新的rpg地图。

今天,他找到一张名为《逃出克隆岛》的地图,在这张地图中,有一个n行m列的矩阵,矩阵由’Y’,’C’,’#’,’*’,’P’,5种元素组成。’Y’表示yh的出生位置,C表示克隆岛的出口,’#’表示该处不可通过,’*’表示通过该处需要消耗金币cost,’P’表示传送阵,任意两个传送阵之间可以免费互相传送。由于这仅仅是第一关,yh不想浪费太多的体力,聪明的你能帮他算出从’Y’出发到’C’最少需要消耗多少金币吗?当然,如果yh永远无法到达’C’,请输出” screw you!”以表到yh的不满。

输入描述 Input Description

第一行两个整数,n,m,表示矩阵有n行m列

接下来为n行m列的矩阵,由’Y’,’C’,’#’,’*’,’P’,组成,含义如题目描述。

输出描述 Output Description

输出1行,表示yh需要花费的最小体力(如果无法到达输出”screw you!”)。

样例输入 Sample Input

【样例输入1】

1 3 3

Y*C

【样例输入2】

1 3 2

Y#C

【样例输入3】

1 5 2

YP#PC

样例输出 Sample Output

【样例输出1】

3

【样例输出2】

screw you!

【样例输出3】

0

数据范围及提示 Data Size & Hint

【数据范围】

对于100%的数据,n*m≤5000,传送阵’P’的数量≤500

思路:

  暴力bfs强行ac

来,上代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>

using namespace std;

struct node {
    int x,y,dis;
};
struct node cur_1,cur_2,cur_3;

const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};

int n,m,p,num_P=0,px[510],py[510],ex,ey,sx,sy;
int pd[5010][5010];

char map[1010][1010];

queue<struct node>que;

void bfs()
{
    memset(pd,127/3,sizeof(pd));
    cur_1.x=sx,cur_1.y=sy,cur_1.dis=0;
    que.push(cur_1);
    pd[sx][sy]=0;
    while(!que.empty())
    {
        cur_1=que.front();
        que.pop();
        for(int i=1;i<=4;i++)
        {
            if(cur_1.x+dx[i]>0&&cur_1.x+dx[i]<=n&&cur_1.y+dy[i]>0&&cur_1.y+dy[i]<=m)
            {
                if(map[cur_1.x+dx[i]][cur_1.y+dy[i]]==‘#‘) continue;
                if(pd[cur_1.x+dx[i]][cur_1.y+dy[i]]<=cur_1.dis) continue;
                pd[cur_1.x+dx[i]][cur_1.y+dy[i]]=cur_1.dis;
                cur_2.x=cur_1.x+dx[i],cur_2.y=cur_1.y+dy[i],cur_2.dis=cur_1.dis;
                if(map[cur_1.x+dx[i]][cur_1.y+dy[i]]==‘*‘)
                {
                    cur_2.dis+=p;
                    que.push(cur_2);
                }
                if(map[cur_2.x][cur_2.y]==‘P‘)
                {
                    que.push(cur_2);
                    for(int j=1;j<=num_P;j++)
                    {
                        if(pd[px[j]][py[j]]<=cur_2.dis) continue;
                        pd[px[j]][py[j]]=cur_2.dis;
                        cur_3.x=px[j],cur_3.y=py[j],cur_3.dis=cur_2.dis;
                        que.push(cur_3);
                    }
                }
                if(map[cur_2.x][cur_2.y]==‘Y‘||map[cur_2.x][cur_2.y]==‘C‘) que.push(cur_2);
            }
        }
    }
}

int main()
{
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++)
    {
        scanf("%s",map[i]+1);
        for(int j=1;j<=m;j++)
        {
            if(map[i][j]==‘P‘) px[++num_P]=i,py[num_P]=j;
            if(map[i][j]==‘C‘) ex=i,ey=j;
            if(map[i][j]==‘Y‘) sx=i,sy=j;
        }
    }
    bfs();
    if(pd[ex][ey]>100000) printf("screw you!\n");
    else printf("%d\n",pd[ex][ey]);
    return 0;
}
时间: 2024-12-16 22:25:44

AC日记——逃出克隆岛 (bfs)的相关文章

codevs 2059 逃出克隆岛

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description oi小组的yh酷爱玩魔兽rpg,每天都会在u9搜索最新的rpg地图. 今天,他找到一张名为<逃出克隆岛>的地图,在这张地图中,有一个n行m列的矩阵,矩阵由’Y’,’C’,’#’,’*’,’P’,5种元素组成.’Y’表示yh的出生位置,C表示克隆岛的出口,’#’表示该处不可通过,’*’表示通过该处需要消耗金币cost,’P’表示传送阵,任意两个传送阵之间可以免费互相传送.由于这仅仅

codevs2059逃出克隆岛(传送门bfs)

/* 和普通的迷宫问题类似只是多了一个叫传送门的东西 对于传送门的处理: 每当跑到传送门就把其余所有传送门周围的点都入队 传送门之间不花费时间并且从不是传送门的点走到传送门 也不花费时间花费时间的(好像说了句废话.) 所以判断一下 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<queue> #include<algorithm> #define maxn 501

逃出你的肖申克(二)(三):笔记

逃出你的肖申克(二):仁者见仁智者见智?从视觉错觉到偏见笔记 1.然而我们的大脑几乎每次都能够从富含歧义的信息中找出最靠谱的解释,作出无比牛B的点估计. 2.先验假设是双刃剑,其锋刃的另一面就是我们常说的"偏见". 3.对于日常生活中的事件,总有一个平凡的解释,和一个疯狂的解释. 4.打破这种偏见的唯一途径就是开阔视野,多积累知识,以及和具有不同知识背景的人讨论,否则就算抱着"我可能是错的"这种信念,你也不知道怎么去证伪自己的一个猜测. 5."这只是一种解

AC日记——Aragorn&#39;s Story HDU 3966

Aragorn's Story Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10510    Accepted Submission(s): 2766 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lor

逃出你的肖申克(五)(六):看不见的牢笼

逃出你的肖申克(五):看不见的牢笼(上)笔记 0. 所谓心理学就是关于人脑如何工作的科学,既然社会是由一个个的人构成,而人的行为很大程度上又由我们的大脑所支配,那么从这个根本上去理解很多问题便非常深入本质. 1.“克拉克第一定律”:“如果一位有名望的老科学家告诉你某件事情是可能的,那么他很可能是对的.然而如果他说某件事情是不可能的,那么他极有可能是错的.” 2.为什么说大多数时候换位思考只是个陷阱.因为真正的换位思考,意味着你必须知道对方大脑中所有真正影响他决策和行为的因素,这包含太多的东西:对

逃出你的肖申克(二)(三)(四)

逃出你的肖申克(二):仁者见仁智者见智?从视觉错觉到偏见笔记 0.然而我们的大脑几乎每次都能够从富含歧义的信息中找出最靠谱的解释,作出无比牛B的点估计. 1.先验假设是双刃剑,其锋刃的另一面就是我们常说的“偏见”. 2.对于日常生活中的事件,总有一个平凡的解释,和一个疯狂的解释. 3.打破这种偏见的唯一途径就是开阔视野,多积累知识,以及和具有不同知识背景的人讨论,否则就算抱着“我可能是错的”这种信念,你也不知道怎么去证伪自己的一个猜测. 4.“这只是一种解释(可能),未必是唯一的解释(可能).(

逃出你的肖申克(四)(五)(六)笔记

逃出你的肖申克(四):理智与情感笔记 1.我们知道答案,却往往不知道真正的求解思维过程. 2.真正的理由有时候往往隐藏在意识触及不到的地方,由我们的情绪大脑所掌控,当它引导我们的情绪大脑作出决定之后,才发个红头文件通知我们的理性大脑,我们的理性大脑于是便像文章开头提到的实验中描述的那样,迅速而果断地给出各种听上去很合理的解释,让我们的决定和行为看上去无懈可击. 3.只要我们的情绪大脑首先认定了一件事情,我们那点可怜的理性思维便很容易屈从于情绪大脑发下的命令--把事情往利于自己的方向解释. 4.只

AC日记——仙岛求药 openjude 2727

仙岛求药 思路: bfs: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxm 10005 const int dx[5]={0,-1,0,1,0}; const int dy[5]={0,0,1,0,-1}; int n,m,quex[maxm],quey[maxm],qu

AC日记——逃离僵尸岛 洛谷 P3393

逃离僵尸岛 思路: spfa: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 200005 #define maxque 1800056 #define INF 1e12 #define ll long long ll n,m,E[maxque],V[maxque],cnt,