进化之地(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)); } }