• 迷宫与宝藏


    描述

    机器人要在一个矩形迷宫里行动(不能原地停留,只能走向上/下/左/右),每移动一格花费1个单位时间。
    迷宫有以下几种元素:

    【*】 机器人的起点

    【#】 墙。机器人不能走过这些格子

    【.】 平地。机器人可以在上面自由行走

    【0-9】 宝藏。当机器人走到此处会立刻获得该数字相应的宝藏,宝藏不会消失,可以反复获取(但不能停留)

    若机器人要恰好获得总和为x的宝藏,它最少需要多少时间?

    输入

    第一行输入任务数量T, 接下来有T个任务
    每块第一行有两个整数, n(0<= n<100), m(0 <=m < 100), 表示迷宫有n+1行和m+1列

    接下来n行输入迷宫

    最后一行输入你要收集的宝藏的总价值x(0<=x ≤ 100)

    输出

    对于每个任务,输出最少花费的时间,如果完成不了该任务则输出-1

    样例输入

    3

    2 3
    1.#2
    #..#
    *.#.
    3

    2 3
    2.#2
    #..#
    *.#.
    5

    2 3
    2.#2
    #.3#
    *.#.
    5

    样例输出

    8
    -1
    6

    解题思路:用bfs对每个位置的每种可能进行枚举

    #include <bits/stdc++.h>
    using namespace std;
    char s[105][105];
    int vis[105][105][105];
    int n,m,k,T,f;
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    struct node
    {
        int x,y,t,v;
        node(){}
        node(int x,int y,int v,int t):x(x),y(y),v(v),t(t){}
    };
    queue<node>qu;
    void bfs(int x,int y)
    {
        qu.push(node(x,y,0,0));
        vis[x][y][0]=1;
        while(!qu.empty()){
            node temp=qu.front();qu.pop();
            
            int x=temp.x,y=temp.y,t=temp.t,v=temp.v;
            if(v==k){
                printf("%d
    ",t);
                f=1;
                return;
            }
            for(int i=0;i<4;i++){
                int xx=x+dir[i][0],yy=y+dir[i][1],tt=t+1,vv=v;
                if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&s[xx][yy]!='#'){
                    if(s[xx][yy]>='1'&&s[xx][yy]<='9'){
                        vv=vv+s[xx][yy]-'0';
                    }
                    if(vis[xx][yy][vv]==0&&vv<=k){
                        vis[xx][yy][vv]=1;
                        qu.push(node(xx,yy,vv,tt));
                    }
                }
            }
        }
    }
    int main()
    {
        scanf("%d",&T);
        while(T--){
            f=0;
            scanf("%d%d",&n,&m);
            n++,m++;
            while(!qu.empty()) qu.pop();
            for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
            scanf("%d",&k);
            for(int i=1;i<=n;i++){
                for(int j=0;j<=m;j++){
                    for(int a=0;a<=k;a++) vis[i][j][a]=0;
                }
            }
            int x,y;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(s[i][j]=='*') x=i,y=j;
                }
            }
            bfs(x,y);
            if(f==0) printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    bugku细心地大象
    【学术篇】一些水的不行的dp
    【笔记篇】莫队算法(一)
    【学术篇】luogu1351 [NOIP2014提高组] 联合权值
    【学术篇】网络流24题——方格取数加强版
    【学术篇】SDOI2009 SuperGCD
    【学术篇】网络流24题——方格取数问题
    【模板篇】A* 寻路算法
    【模板篇】k短路 SDOI2010 魔法猪学院
    【学术篇】SDOI2009 最优图像
  • 原文地址:https://www.cnblogs.com/ww123/p/11652662.html
Copyright © 2020-2023  润新知