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;
}

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6066167.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值