zoukankan      html  css  js  c++  java
  • ZSC新生赛 沼跃鱼早已看穿了一切

    Description

     沼跃鱼打开密码门后发现门后是一个像迷宫一样的房间,墙上的指示牌写着:房间内某处有一宝箱,但是宝箱被上锁了,钥匙在这个房间的某个角落。沼泽鱼对宝箱里有什么很感兴趣,但它必须先去拿到钥匙才可以打开宝箱。然而沼跃鱼早已看穿了一切,它看清了这个房间的布局,现在给出房间的布局图,问沼跃鱼拿到钥匙并打开宝箱最少需要走多少步。沼跃鱼每次只能向上、下、左、右中其中一个方向走一步,但若那个位置是墙时则不能往那个位置走(显然,沼跃鱼不能穿墙)。

    Input

    输入的第一行是一个整数T(0<T<20),代表接下来有T组数据。


     每组数据的第一行有两个整数n,m(0<n,m≤10),n代表房间的宽度,m代表房间的长度。

    接下来n行,每行有m个字符,‘S’表示开始时沼跃鱼所处的位置,‘#’代表墙,‘*’代表空地,‘K’代表钥匙,‘B’表示宝箱。钥匙只有一把。

    详情参看样例输入。

    Output

     对于每组数据,输出一行包含一个整数x,x代表沼跃鱼拿到钥匙并打开宝箱所需的最少步数。若沼跃鱼不能够拿到钥匙并打开宝箱(即到达不了钥匙或宝箱所在处)则输出-1。

    Sample Input

    1 5 6
    ***#B#
    S**#*#
    ##***#
    K#*#*#
    ***#*#

    Sample Output

    17

    HINT

    对于样例数据,房间宽5个单位,长6个单位。


    从S出发到K需要的最少步数为8,而从K出发到B所需的最少步数为9.

    所以答案为8 + 9 = 17.


    请使用scanf("%s", s);或cin>> s;来读取字符串以避免出现漏读多读的情况。

    Source

     
     
    思路:用BFS广度优先搜索。。。。调用两次bfs算t1,t2
     
    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    char str[12][12];
    int vis[12][12],n,m;
    struct node
    {
        int x;
        int y;
    };
    int bfs(node a,node b)
    {
        memset(vis,0,sizeof(vis));
        node c,temp;
        queue<node> q;
        q.push(a);
        while(!q.empty())
        {
            c=q.front();
            q.pop();
            //cout<<c.x<<" "<<c.y<<endl;
            if(str[c.x+1][c.y]!='#'&&!vis[c.x+1][c.y]&&c.x+1<n)
            {
                vis[c.x+1][c.y]=vis[c.x][c.y]+1;
                temp.x=c.x+1,temp.y=c.y;
                q.push(temp);
            }
            if(str[c.x - 1][c.y]!='#'&&!vis[c.x-1][c.y]&&c.x-1>=0)
            {
                vis[c.x-1][c.y]=vis[c.x][c.y]+1;
                temp.x=c.x-1,temp.y=c.y;
                q.push(temp);
            }
            if(str[c.x][c.y+1]!='#'&&!vis[c.x][c.y+1]&&c.y+1<m)
            {
                vis[c.x][c.y+1]=vis[c.x][c.y]+1;
                temp.x=c.x,temp.y=c.y+1;
                q.push(temp);
            }
            if(str[c.x][c.y-1]!='#'&&!vis[c.x][c.y-1]&&c.y-1>=0)
            {
                vis[c.x][c.y-1]=vis[c.x][c.y]+1;
                temp.x=c.x,temp.y=c.y-1;
                q.push(temp);
            }
        }
        if(vis[b.x][b.y])
        {
            return vis[b.x][b.y];
        }
        return -1;
    }
    int main()
    {
    #ifdef CDZSC_OFFLINE
        freopen("in.txt","r",stdin);
    #endif
        int t,i,j,t1,t2,flag,flag1,flag2;
        node a,b,c;
        scanf("%d",&t);
        while(t--)
        {
            memset(str,0,sizeof(str));
            scanf("%d%d",&n,&m);
            for(i=0; i<n; i++)
            {
                scanf("%s",str[i]);
            }
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    if(str[i][j]=='S')
                    {
                        a.x=i,a.y=j;
                    }
                    if(str[i][j]=='K')
                    {
                        b.x=i,b.y=j;
                    }
                    if(str[i][j]=='B')
                    {
                        c.x=i,c.y=j;
                    }
                }
            }
            t1=bfs(a,b);
            t2=bfs(b,c);
            if(t1==-1||t2==-1)
            {
                printf("-1
    ");
            }
            else
            {
                printf("%d
    ",t1+t2);
            }
        }
        return 0;
    }
  • 相关阅读:
    【转】Windows Phone的应用程序认证要求
    ObservableCollection删除问题
    国庆总结?
    .net dll破解实战
    理理头绪
    创建Metro风格的WPF界面
    Alpha项目测试
    原型设计
    团队项目总结
    最常用的35中心里效应
  • 原文地址:https://www.cnblogs.com/Wing0624/p/4245159.html
Copyright © 2011-2022 走看看