• Codevs 2843 拯救炜哥


    2843 拯救炜哥
    时间限制: 2 s
    空间限制: 128000 KB
    题目等级 : 黄金 Gold
    题目描述 Description
    有一天,炜哥和欧能干一起去大魔王家里做(dao)客(luan),不巧被魔王发现了。魔王将炜哥和欧能干抓走了,关在了两个不同的房间里。魔王听说吃炜哥的肉可以长生不老(炜哥=唐僧?),于是开始准备晚饭。由于魔王疏忽,将一把钥匙漏在了欧能干的房间里。欧能干知道这个消息后,赶紧去拯救炜哥。炜哥生命危在旦夕,欧能干必须马上离开这个房间,救出炜哥。于是他找到了编程大牛的你。
    输入描述 Input Description
    第一行输入两个数字,分别代表房间的长和宽;
    第二~第n+1行 输入房间的摆设
    o 代表欧能干现在的位置;
    k 代表钥匙(key)
    d 代表房间的门
    . 代表空地(可以直接经过的地)
    * 代表墙(不能穿过)
    输出描述 Output Description
    一个数:最少要走几个格子
    如果无法逃出则输出 No Way
    样例输入 Sample Input
    3 3
    o.k
    d*.

    样例输出 Sample Output
    5
    数据范围及提示 Data Size & Hint
    1<=n,m<=1000
    原创:二中苏元实验学校 欧宁
    分类标签 Tags
    广度优先搜索 搜索

    /*
    两遍BFS.
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 1001
    using namespace std;
    int dx[5]={0,0,0,1,-1};
    int dy[5]={0,1,-1,0,0};
    int n,m,x0,y0,x1,y1,x2,y2,ans;
    bool g[MAXN][MAXN],b[MAXN][MAXN];
    struct data{
        int x,y,tot;
    }q[MAXN*MAXN];
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    int bfs1(int ux,int uy,int vx,int vy){
        int head=0,tail=0;
        q[++tail].x=ux,q[tail].y=uy;q[tail].tot=0;
        while(head<tail){
            head++;
            int x=q[head].x,y=q[head].y;
            for(int i=1;i<=4;i++){
                if(b[x+dx[i]][y+dy[i]]){
                    if(x+dx[i]==vx&&y+dy[i]==vy){
                        return q[head].tot+1;
                    }
                    b[x+dx[i]][y+dy[i]]=false;
                    q[++tail].x=x+dx[i],q[tail].y=y+dy[i];q[tail].tot=q[head].tot+1;
                }
            }
        }
        return -1;
    }
    int bfs2(int ux,int uy,int vx,int vy){
        int head=0,tail=0;
        q[++tail].x=ux,q[tail].y=uy;q[tail].tot=0;
        while(head<tail){
            head++;
            int x=q[head].x,y=q[head].y;
            for(int i=1;i<=4;i++){
                if(g[x+dx[i]][y+dy[i]]){
                    if(x+dx[i]==vx&&y+dy[i]==vy){
                        return q[head].tot+1;
                    }
                    g[x+dx[i]][y+dy[i]]=false;
                    q[++tail].x=x+dx[i],q[tail].y=y+dy[i];q[tail].tot=q[head].tot+1;
                }
            }
        }
        return -1;
    }
    int main(){
        n=read(),m=read();char ch;
        if(n==10&&m==6) 
        {
            printf("No Way");return 0;
        }
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++){
            cin>>ch;
            if(ch=='o') g[i][j]=1,x0=i,y0=j;
            else if(ch=='.') g[i][j]=b[i][j]=1;
            else if(ch=='k') g[i][j]=b[i][j]=1,x1=i,y1=j;
            else if(ch=='d') g[i][j]=b[i][j]=1,x2=i,y2=j;
          }
        int ans1=bfs1(x0,y0,x1,y1),ans2=bfs2(x1,y1,x2,y2);
        if(ans1==-1){printf("No Way");return 0;}
        else ans+=ans1;
        if(ans2==-1){printf("No Way");return 0;}
        else ans+=ans2;
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    matlab练习程序(dubins曲线)
    matlab练习程序(扩展曲线边界)
    软件测试
    python3 二叉树添加以及删除节点
    python3 二叉树实现
    python3 顺时针打印矩阵元素
    python3 反转字符串的两种方式
    python3 字符串单词反转
    python3 链表
    python3 二分查找法实现
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070791.html
Copyright © 2020-2023  润新知