NOI 题库 7218

7218  献给阿尔吉侬的花束

描述

阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。

迷宫用一个R×C的字符矩阵来表示。字符S表示阿尔吉侬所在的位置,字符E表示奶酪所在的位置,字符#表示墙壁,字符.表示可以通行。阿尔吉侬在1个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。

输入
第一行是一个正整数T(1 <= T <= 10),表示一共有T组数据。
每一组数据的第一行包含了两个用空格分开的正整数R和C(2 <= R, C <= 200),表示地图是一个R×C的矩阵。
接下来的R行描述了地图的具体内容,每一行包含了C个字符。字符含义如题目描述中所述。保证有且仅有一个S和E。
输出
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。每组数据的输出结果占一行。
样例输入
3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.
样例输出
5
1
oop!
 #include "bits/stdc++.h"

 using namespace std ;
const int maxN = 1e5 + 1e3 ;
const int INF = ; int start_x , start_y , des_x , des_y ;
const int dx [ ] = { , , - , } ;
const int dy [ ] = { , , , - } ; char mp[ ][ ] ;
int pos_x[ maxN ] , pos_y [ maxN ] ,step[ maxN ] ;
void Scan ( const int n , const int m ) {
getchar ( ) ;
for ( int i= ; i<=n ; ++i ) {
for ( int j= ; j<=m ; ++j ) {
mp[ i ][ j ] = getchar ( ) ;
if ( mp [ i ][ j ] == 'S' ) {
start_x = i ;
start_y = j ;
}
if( mp[ i ][ j ] == 'E' ) {
des_x = i ;
des_y = j ;
mp[ i ][ j ] = '.' ;
}
}
getchar ( ) ;
}
} void BFS ( const int n , const int m ) {
int Head = , Tail = ;
bool Get_Target = false ;
pos_x[ Tail ] = start_x ;
pos_y[ Tail ] = start_y ;
step[ Tail ] = ;
mp[ start_x ][ start_y ] = '#' ;
while ( Head < Tail ) {
++ Head ;
for ( int i= ; i< ; ++i ) {
int xx = pos_x[ Head ] + dx[ i ] ;
int yy = pos_y[ Head ] + dy[ i ] ;
if ( xx > && xx <= n && yy >= && yy <= m && ( mp[ xx ][ yy ] == '.' || mp[ xx ][ yy ] == '*' ) ) {
step[ ++ Tail ] = step[ Head ] + ;
mp[ xx ][ yy ] = '#' ;
pos_x [ Tail ] = xx ;
pos_y [ Tail ] = yy ;
if ( xx == des_x && yy == des_y ) {
Get_Target = true ;
printf ( "%d\n" , step[ Tail ] ) ;
}
}
}
}
if ( !Get_Target ) { printf ( "oop!\n" ) ; }
} int main ( ) {
int N , M , T ;
scanf ( "%d" , &T ) ;
while ( T-- ) {
scanf ( "%d%d" , &N , &M ) ;
Scan ( N , M ) ;
BFS ( N , M );
}
}

2016-10-19 13:14:49

()

上一篇:多级菜单系统安装维护shell脚本实现企业级案例


下一篇:Linux日记本_10:文件/目录的权限说明