BNU 49102进化之地(Evoland) BFS

2024-05-12 20:38
文章标签 bfs 进化 之地 bnu 49102 evoland

本文主要是介绍BNU 49102进化之地(Evoland) BFS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进化之地(Evoland)

1000ms
65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Prev  Submit  Status  Statistics  Discuss  Next
Font Size:   
Type: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                    
  • 最近xhyu和hwq欢乐地通了一款RPG(Role-playing game)神作——《进化之地》,这是一部用RPG讲述RPG发展史的RPG。随着剧情发展,游戏从最原始的2D黑白像素块无音乐模式,逐渐变为32位色图,有了音效,开启打怪、对话、升级模式,纹理映射,连NPC都是开宝箱开出来的,带着玩家从20年前的FC时代走到如今的3D动作游戏中。

    其中一个名为“神圣森林”的迷宫设计十分巧妙,玩家需要不停地在2D画面和3D画面之间切换来通过。

    如下图:

                 

    很明显左边是2D模式,右边是3D 模式。

    2D模式下,小树苗(左边红圈)可以通过,而高台(上方红圈)不能通过;

    3D模式下,小树苗(中间红圈)不能通过,而高台(下方红圈)可以通过;

    两个模式中,都有一个蓝色的东西,那是时空之石,通过击打它可以在2D模式与3D模式间转换。

     

    经过半个小时努力终于通过这里以后,聪慧的hwq表示要用ACM的眼光严肃看待这个问题,于是随手画了几个图,让xhyu速速的找到每个图的解法,找不到没人权。

    为了尽快恢复人权,xhyu只好向聪慧的你求助。

    注意:为了避免误会说明一下,上面两幅图不是同一个小场景的截图,正常情况下,当击打时空之石时,场景中所有物品的相对位置不变,只是2D效果和3D效果改变了。

    Input

    输入的第一行是一个整数t,表示数据组数。(t<=30)

    对每组数据:第一行三个整数n,m,分别为地图的行数、列数。(1<n,m<=100)

    接下来有n行字符串,每行m个字符,各个字符含义:

    0 起点(每图只有一个,初始为2D)

    1 终点(每图只有一个,结束时可以是2D可以是3D)

    . 通路(2D/3D均可通过)

    # 障碍物(2D/3D均不可通过)

    @ 时空之石(2D/3D均可通过)

    2 小树苗(2D可通过,3D不可通过)

    3 高台(3D可通过,2D不可通过)

     

    保证每个图的时空之石数量不超过12,保证输入合法。

    注意:

    1.初始为2D状态,到达终点时可以2D也可以3D;

    2.经过时空之石时可以选择切换2D/3D也可以不切换;

    3.必须走到时空之石那一格才能切换2D/3D,时空之石可以正常通过;

    4.切换2D/3D是在原地进行,不算做一步;

    5.中途允许经过起点,时空之石可以多次使用,障碍物无论2D/3D都不能通过。

    Output

    每组数据输出一个整数,表示从起点走到终点最少需要多少步,如果不能走到终点,则输出-1。

    Sample Input

    3
    1 6
    #@0.311 7
    2@303.17 5
    .####
    .1..#
    ###3#
    .@#.#
    .##.#
    ....#
    0####

    Sample Output

    5
    -1
    16

    Hint

    各字符宽度不一样不方便查看,建议把样例写下来观察。

    (1)先向左走到@转换为3D,再向右走到终点;

    (2)初始是2D,左右都走不通,无解输出-1;

    (3)先去触发时空之石,再去终点;

    Source

    第十三届北京师范大学程序设计竞赛决赛

    Author

    yxh
    #include<stdio.h>
    #include<queue>
    #include<string.h>
    using namespace std;
    const int N = 105;
    struct node{int x,y,t,d;
    };
    char mapt[N][N];
    int n,m;
    int bfs(int sx,int sy){queue<node>q;node now,pre;int vist[2][N][N]={0},dir[4][2]={0,1,0,-1,1,0,-1,0};now.x=sx, now.y=sy, now.t=0, now.d=0;q.push(now); vist[0][sx][sy]=1;while(!q.empty()){pre=q.front(); q.pop();for(int e=0;e<4;e++){now.x=pre.x+dir[e][0];now.y=pre.y+dir[e][1];now.t=pre.t+1;now.d=pre.d;if(now.x>=0&&now.x<n&&now.y>=0&&now.y<m&&mapt[now.x][now.y]!='#'&&vist[now.d][now.x][now.y]==0){if(mapt[now.x][now.y]=='1')return now.t;if(now.d==0&&mapt[now.x][now.y]!='3'||now.d==1&&mapt[now.x][now.y]!='2')q.push(now),vist[now.d][now.x][now.y]=1;if(mapt[now.x][now.y]=='@'){now.d=!now.d;if(vist[now.d][now.x][now.y]==0&&(now.d==0&&mapt[now.x][now.y]!='3'||now.d==1&&mapt[now.x][now.y]!='2'))q.push(now),vist[now.d][now.x][now.y]=1;}}}}return -1;
    }
    int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);int sx=-1,sy;for(int i=0;i<n;i++){scanf("%s",mapt[i]);for(int j=0;j<m&&sx==-1;j++)if(mapt[i][j]=='0'){sx=i; sy=j; break;}}printf("%d\n",bfs(sx,sy));}
    }
    


    这篇关于BNU 49102进化之地(Evoland) BFS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/983683

    相关文章

    hdu1254(嵌套bfs,两次bfs)

    /*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

    poj 2195 bfs+有流量限制的最小费用流

    题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

    POJ 3057 最大二分匹配+bfs + 二分

    SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

    深度优先(DFS)和广度优先(BFS)——算法

    深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

    Python中差分进化differential_evolution的调用及参数说明

    在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

    双头BFS

    牛客月赛100 D题,过了80%数据,调了一下午。。。烦死了。。。 还是没调试出来,别人的代码用5维的距离的更新有滞后性,要在遍历之前要去重。。。 #include<bits/stdc++.h>using namespace std;const int N=2e3+10;char g[N][N];int dis[N][N],d1[N][N];int n,m,sx,sy;int dx

    Knight Moves -uva 简单的BFS遍历

    昨天刚学了BFS的遍历,在uva上找了个题敲了出来,感觉还不错,最近敲代码挺有手感的,希望这种状态保持下去 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10 + 5#define LEN 100 + 10using namespace std;in

    【CF】D. Arthur and Walls(BFS + 贪心)

    D题 解题思路就是每次检查2X2的方格里是否只有一个‘*’,如果有的话这个*就需要变成‘.’,利用BFS进行遍历,入队的要求是这个点为. 一开始将所有的'.'全部加入队列,如果碰到一个'*'变成'.'就入队,判断的时候从4个方向就行判断 题目链接:http://codeforces.com/contest/525/problem/D #include<cstdio>#include<

    hdu2717(裸bfs广搜)

    Catch That Cow Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7304 Accepted Submission(s): 2308 题目链接: http://acm.hdu.edu.cn/showproblem.

    Codeforces#295(Div.2)A、B(模拟+BFS)

    解题报告链接:点击打开链接 C. 题目链接:点击打开链接 解题思路: 对于给定的字符串,取出现次数最多的字母(可以同时有多个)。由这些字母组成长度为n的字符串,求有多少种组合。最后用数学知识即可。 完整代码: #include <algorithm>#include <iostream>#include <cstring>#include <climits>