时间限制: 1 Sec 内存限制: 128 MB
提交: 138 解决: 52
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
伯罗奔尼撒战争是以雅典为首的提洛同盟与以斯巴达为首的伯罗奔尼撒联盟之间的一场战争。这场战争从前431年一直持续到前404年,使得绝大多数周边城邦必须加入其中一方的阵营。战争第一阶段(BC431-BC421),雅典在伯里克利的领导之下,凭借强大的海军,采取陆地上防御在海上进攻的策略。而斯巴达在阿基达摩斯二世的领导之下,率领它令人畏惧的战士进行陆地强攻。两个强邦侧重点不同的军事力量导致了战争第一阶段的僵持局面。
话说,有一天阿基达摩斯二世决定率兵进攻雅典的一个居民点阿提卡,当他们满怀斗志的奔向阿提卡的时候,殊不知他们正走向伯利克里所设下的迷宫陷阱之中。当他们发现时,已为时已晚。
As you know, the Magpie Festival is comging!
为了早日返回斯巴达,阿基达摩斯二世立即让所有的斯巴达勇士去需找迷宫的出口E。现在他们被困在迷宫的S点,迷宫中“.”表示空地,可以通过,“#”表示墙,不能通过,每次只能向上下左右四个方向移动,每移动一个单位距离需要耗费一个单位时间,所有斯巴达勇士的移动速度相同。现在请你计算一下他们最短需要多少时间才能找到迷宫的出口。
PS:假设迷宫中每个点可以容纳的人数没有限制,每个斯巴达勇士的行动方向之间没有影响。
输入
第一行有一个整数t(0=<t<=100),代表有t组测试数据。
每组测试数据第一行输入三个数n,m, c,(2=<m<=n<=500,100=<c<=10000)分别代表迷宫的长度和宽度,以及被困迷宫的斯巴达勇士数(不包括阿基达摩斯二世)。下面m行每行有n个字符用来表示迷宫地图。详细输入格式见样例。
输出
输出一个整数,表示找到迷宫出口的最短时间,每组输出占一行。如不能找到出口输入-1
样例输入
1 5 5 100 ##### #S..# #...# #...E #####
样例输出
5
这题裸的,下一题有点改模板
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#define INF 10000000
using namespace std;
typedef pair<int,int> P; //结构体状态,表示该点的坐标
int n,m,k;
int dp[505][505]; //表示起点到其他点的距离
char c[505][505]; //迷宫
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int sx,sy,gx,gy;
int bfs()
{
queue<P> que;//创建一个里面是结构体的队列
//所有的位置初始化为INF
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)dp[i][j]=INF;
//从起点开始寻找,所以将起点坐标添加到队列中
que.push(P(sx,sy));
//将该位置初始化为0
dp[sx][sy]=0;
while(que.size()){
//从队列的最前端去除元素
P p=que.front();
que.pop();
//如果取出的状态是终点,结束遍历
if(p.first==gx && p.second == gy)break;
//四个方向循环
for(int i=0;i<4;i++){
//移动之后的坐标nx,ny
int nx=p.first+dx[i],ny=p.second+dy[i];
//判断是否可以移动,以及是否访问过
if(nx>=0 && nx<n && ny>=0 && ny<m && c[nx][ny]!='#' && dp[nx][ny]==INF){
//如果可以访问的话,添加到队列中,并且到该位置的距离为到p的距离+1
que.push(P(nx,ny));
dp[nx][ny]=dp[p.first][p.second]+1;
}
}
}
return dp[gx][gy];
}
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
scanf("%d%d%d", &n, &m, &k);
getchar(); //吸收换行符
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&c[i][j]);
if(c[i][j]=='S'){ //记录起始点
sx=i;
sy=j;
}
if(c[i][j]=='E'){ //记录终点
gx=i;
gy=j;
}
}
getchar(); //吸收换行符
}
int res=bfs();
if(res==INF)
printf("-1\n");
else
{
printf("%d\n",res);
}
}
return 0;
}