首页 > 试题广场 >

校赛-F.Guilty Crown

[问答题]

题目标题:

校赛-F.Guilty Crown

题目描述:

樱满集(写作集念作锈)是个拥有王之力量的男人,为了阻止恙神涯引发第3次失落的圣诞节并救出祈,果断侵入御台场的24区。这座复杂的建筑物里有各种各样的通道,房间,死路之类的东西。

在行动之前,集拜托鸫找出一条离祈最近的路,告诉集要最快多久才能找到祈

输入描述:

输入可能包含多个测试样例。

第一行包含两个数R L C (1 <= R, L, C <= 30)

接下来是RL*C的矩阵(LC列)。

# 表示房间,不可通行

. 表示道路,可以通行

S 表示集开始位置

E 表示祈的所在位置

每个测试用例之间有个空行

输出描述:

若集可以到达祈的地方,输出一行包含一个数字k,表示集到祈的最短距离;否则输出一行包含字符串Sota!!

样式输入:

3 4 5

S....

.###.

.##..

###.#

#####

#####

##.##

##...

#####

#####

#.###

####E

1 3 3

S##

#E#

###

样式输出:

11

Sota!!

#include<stdio.h>

#include<queue>

using namespace std;

struct Position

{int x,y,z,cnt;};

int dir[][3]={{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};

char map[35][35][35];

int BFS(Position p)

{

queue<Position> q;

q.push(p);

while(!q.empty())

{

p=q.front();

q.pop();

int i;

for(i=0;i<6;i++)

{

Position s=p;

s.x+=dir[i][0];

s.y+=dir[i][1];

s.z+=dir[i][2];

s.cnt++;

if(map[s.x][s.y][s.z]=='.')

{

q.push(s);

map[s.x][s.y][s.z]='#';

}

else if(map[s.x][s.y][s.z]=='E')

return s.cnt;

}

}

return 0;

}

int main()

{

int L,R,C;

while(scanf("%d%d%d",&L,&R,&C)!=EOF)

{

memset(map,'#',sizeof(map));

Position p;

p.cnt=0;

int i,j,k;

for(i=1;i<=L;i++)

for(j=1;j<=R;j++)

{

scanf("%s",&map[i][j][1]);

for(k=1;k<=C;k++)

if(map[i][j][k]=='S')

{

p.x=i;

p.y=j;

p.z=k;

}

}

int res=BFS(p);

if(res) printf("%d\n",res);

else printf("Sota!!\n");

}

return 0;

}

发表于 2017-05-15 00:25:55 回复(0)