zoukankan      html  css  js  c++  java
  • codevs 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 

    屠龙宝刀点击就送

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    
    using namespace std;
    char tx[5000][5000];
    bool csm[5000][5000],vis[5000][5000];
    int cost,start_x,start_y,over_x,over_y,n,m,fx[5]={1,-1,0,0},fy[5]={0,0,-1,1};
    void print(int k)
    {
        printf("%d",k);
        exit(0);
    }
    void bfs(int sx,int sy)
    {
        int f[50000][4],l=0,r=0;
        f[++r][1]=sx;
        f[r][2]=sy;
        f[r][3]=0;
        do
        {
            int now_x=f[++l][1],now_y=f[l][2];
            for(int j=0;j<4;++j)
            {
                int to_x=now_x+fx[j],to_y=now_y+fy[j];
                if(to_x==over_x&&to_y==over_y)
                print(f[l][3]);
                if(to_x>=1&&to_x<=n&&to_y>=1&&to_y<=m&&tx[to_x][to_y]!='#'&&vis[to_x][to_y]==0)
                {
                    if(csm[to_x][to_y]==1)
                    {
                        f[++r][1]=to_x;
                        f[r][2]=to_y;
                        f[r][3]=f[l][3];
                        csm[to_x][to_y]=0;
                        for(int i=1;i<=n;++i)
                        {
                            for(int k=1;k<=m;++k)
                            {
                                if(csm[i][k]==1)
                                {
                                    csm[i][k]=0;
                                    f[++r][1]=i;
                                    f[r][2]=k;
                                    f[r][3]=f[l][3];
                                }
                            }
                        }
                    }
                    else
                    {
                        vis[to_x][to_y]=1;
                        f[++r][1]=to_x;
                        f[r][2]=to_y;
                        if(tx[to_x][to_y]=='*') f[r][3]=f[l][3]+cost;
                        else f[r][3]=f[l][3];
                    }
                }
            }
            
        }while(l<=r);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&cost);
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
            {
                cin>>tx[i][j];
                if(tx[i][j]=='P') csm[i][j]=1;
                else if(tx[i][j]=='Y') start_x=i,start_y=j;
                else if(tx[i][j]=='C') over_x=i,over_y=j;
            }
        }
        bfs(start_x,start_y);
        printf("screw you!");
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    Flex Cairngorm简介
    caringorm3学习
    实现自动间休[原创]
    vs2003/vs2005快捷键使用大全(转帖)
    美国流行口语26句
    日记 [2007年08月29日]
    一个博客的排版问题,郁闷中
    你真的懂我吗?<谈谈接口>
    教你如何辨别手机是行货还是水货
    五十音图速记法
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6613722.html
Copyright © 2011-2022 走看看