2324: 【作】【入门】古希腊之争

内存限制:1024 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:5 解决:2

题目描述

伯罗奔尼撒战争是以雅典为首的提洛同盟与以斯巴达为首的伯罗奔尼撒联盟之间的一场战争。这场战争从前431年一直持续到前404年,使得绝大多数周边城邦必须加入其中一方的阵营。战争第一阶段(BC431-BC421),雅典在伯里克利的领导之下,凭借强大的海军,采取陆地上防御在海上进攻的策略。而斯巴达在阿基达摩斯二世的领导之下,率领它令人畏惧的战士进行陆地强攻。两个强邦侧重点不同的军事力量导致了战争第一阶段的僵持局面。

话说,有一天阿基达摩斯二世决定率兵进攻雅典的一个居民点阿提卡,当他们满怀斗志的奔向阿提卡的时候,殊不知他们正走向伯利克里所设下的迷宫陷阱之中。当他们发现时,已为时已晚。

As you know, the Magpie Festival is comging!

为了早日返回斯巴达,阿基达摩斯二世立即让所有的斯巴达勇士去需找迷宫的出口 lns="http://www.w3.org/1998/Math/MathML"> 。现在他们被困在迷宫的 lns="http://www.w3.org/1998/Math/MathML"> 点,迷宫中.表示空地,可以通过,#表示墙,不能通过,每次只能向上下左右四个方向移动,每个勇士每移动一个单位距离需要耗费一个单位时间,所有斯巴达勇士的移动速度和方向相同。现在请你计算一下他们所有人要找到迷宫的出口,最少需要时间之和是多少。

PS:假设迷宫中每个点可以容纳的人数没有限制。

输入

第一行输入三个数 lns="http://www.w3.org/1998/Math/MathML">,, ,(lns="http://www.w3.org/1998/Math/MathML">2500,10010000)分别代表迷宫的长度和宽度,以及被困迷宫的斯巴达勇士数(不包括阿基达摩斯二世)。

下面 lns="http://www.w3.org/1998/Math/MathML"> 行每行有 lns="http://www.w3.org/1998/Math/MathML"> 个字符用来表示迷宫地图。

详细输入格式见样例。

输出

输出一个整数,表示找到迷宫出口时,所有勇士消耗的最短时间之和,如不能找到出口输入 lns="http://www.w3.org/1998/Math/MathML">1 。

样例输入 复制

5 5 100
#####
#S..#
#...#
#...E
#####

样例输出 复制

500

提示

#include<bits/stdc++.h>
using namespace std;
#define MAXN 510
struct coord {
    int x,y;
};
queue<coord> Q;
int dep[MAXN][MAXN];
char a[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int n,m,sx,sy,ex,ey,t;
void bfs(int sx,int sy){
    coord tmp = {sx,sy};
    Q.push(tmp);
    vis[sx][sy]=1;
    dep[sx][sy]=0;
    while(!Q.empty()){
        coord u=Q.front();
        int x=u.x,y=u.y;
        Q.pop();
        for(int i=0;i<=4;i++){
            int tx=x+dx[i],ty=y+ dy[i];
            if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&vis[tx][ty]!=1&&a[tx][ty]!='#'){
                dep[tx][ty]=dep[x][y]+1;
                if(a[tx][ty]=='E'){
                	return;
				}
            	coord tmp={tx,ty};
            	Q.push(tmp);       
            	vis[tx][ty]=1;
			}

       }
    }	
}
int main(){
	memset(dep,-1,sizeof(dep));
	cin>>n>>m>>t; 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='S'){
				sx=i;
				sy=j;
			}
			else if(a[i][j]=='E'){
				ex=i;
				ey=j;
			}
		}
	}
	bfs(sx,sy);
	if(dep[ex][ey]==-1){
		cout<<-1;
		return 0;
	}
    cout<<dep[ex][ey]*t;
	return 0;
}