BNU 49102进化之地(Evoland) BFS

进化之地(Evoland)

Time Limit: 1000ms

Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name: Main

Prev Submit Status Statistics Discuss Next

Font Size: 
+
 
-

Type:  
None Graph Theory 
    2-SAT     Articulation/Bridge/Biconnected Component
     Cycles/Topological Sorting/Strongly Connected Component
     Shortest Path 
        Bellman Ford         Dijkstra/Floyd Warshall
     Euler Trail/Circuit
     Heavy-Light Decomposition
     Minimum Spanning Tree
     Stable Marriage Problem
     Trees 
    Directed Minimum Spanning Tree 
    Flow/Matching         Graph Matching
             Bipartite Matching
             Hopcroft–Karp Bipartite Matching
             Weighted Bipartite Matching/Hungarian Algorithm
         Flow 
            Max Flow/Min Cut 
            Min Cost Max Flow 
DFS-like     Backtracking with Pruning/Branch and Bound
     Basic Recursion 
    IDA* Search     Parsing/Grammar
     Breadth First Search/Depth First Search
     Advanced Search Techniques
         Binary Search/Bisection
         Ternary Search
 Geometry 
    Basic Geometry     Computational Geometry
     Convex Hull 
    Pick‘s Theorem Game Theory
     Green Hackenbush/Colon Principle/Fusion Principle
     Nim 
    Sprague-Grundy Number 
Matrix     Gaussian Elimination
     Matrix Exponentiation
 Data Structures 
    Basic Data Structures 
    Binary Indexed Tree 
    Binary Search Tree 
    Hashing     Orthogonal Range Search
     Range Minimum Query/Lowest Common Ancestor
     Segment Tree/Interval Tree
     Trie Tree 
    Sorting     Disjoint Set
 String 
    Aho Corasick     Knuth-Morris-Pratt
     Suffix Array/Suffix Tree
 Math 
    Basic Math     Big Integer Arithmetic
     Number Theory 
        Chinese Remainder Theorem 
        Extended Euclid 
        Inclusion/Exclusion 
        Modular Arithmetic 
    Combinatorics         Group Theory/Burnside‘s lemma
         Counting 
    Probability/Expected Value 
Others     Tricky 
    Hardest     Unusual
     Brute Force 
    Implementation     Constructive Algorithms
     Two Pointer 
    Bitmask     Beginner
     Discrete Logarithm/Shank‘s Baby-step Giant-step Algorithm
     Greedy 
    Divide and Conquer 
Dynamic Programming

Tag it!

最近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.31

1 7
[email protected]

7 5
.####
.1..#
###3#
[email protected]#.#
.##.#
....#
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));
    }
}
时间: 2024-10-10 08:15:15

BNU 49102进化之地(Evoland) BFS的相关文章

BNU - 49102

进化之地(Evoland) Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 49102 Font Size: 最近xhyu和hwq欢乐地通了一款RPG(Role-playing game)神作——<进化之地>,这是一部用RPG讲述RPG发展史的RPG.随 着剧情

bfs 拓扑排序 bnu Usoperanto

题目链接:http://acm.bnu.edu.cn/v3/problem_show.php?pid=39572 题目详细分析:http://talk.icpc-camp.org/d/127-jag-summer-2012-day-4-j-usoperanto 对于这个题目,自己的一点补充(bfs 拓扑排序):在建树的时候,每建立一条边,父亲节点出度+1,因此树叶子节点的出度是为0的(题解里说的入度其实就是在建边的时候父亲节点的出度):那么把所有出度为0的节点压入队列,然后计算这些出度为0的节点

bnu 51641 Certain Maze(bfs)(北师16校赛)

最近,无聊的过河船同学发现了一种无聊的迷宫生成算法. 算法过程如下: 一个的矩形区域可以看作个单位网格组成.在每个网格中,随机生成一个从右上角到左下角的L型障碍或者从左上角到右下角的R型障碍(障碍可以被看作一条线段). 图1:两种障碍 这样便可以生成一个大小为的迷宫,如图2所示. 图2:无聊的迷宫 然后过河船同学想知道,是否存在迷宫内的从迷宫上边界到达迷宫的下边界的路径.于是无聊的过河船同学花了一夜的时间,终于找到一条路径. 图3:过河船同学辛辛苦苦找到的道路 痛苦的过河船同学不想再伤害自己的眼

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

POJ3967Ideal Path[反向bfs 层次图]

Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colo

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带