求助站外题
  • 板块灌水区
  • 楼主wscmh
  • 当前回复17
  • 已保存回复17
  • 发布时间2024/4/15 21:12
  • 上次更新2024/4/16 10:00:31
查看原帖
求助站外题
1017173
wscmh楼主2024/4/15 21:12

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

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

As you know, the Magpie Festival is comging!

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

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

输入 第一行输入三个数n,m, c,(2=<m<=n<=500,100=<c<=10000)分别代表迷宫的长度和宽度,以及被困迷宫的斯巴达勇士数(不包括阿基达摩斯二世)。

下面m行每行有n个字符用来表示迷宫地图。

详细输入格式见样例。

输出 输出一个整数,表示找到迷宫出口时,所有勇士消耗的最短时间之和,如不能找到出口输入-1。

样例
输入
5 5 100

//井号*5,打不出来
#S..#
#...#

//井号再次*5,打不出来
输出
500

贴个错误码```cpp #include<bits/stdc++.h> using namespace std; bool a[10005][10005]={0};//zb int d[10005][10005]={0};//bs int f=0; int wzx[4]={0,0,1,-1}; int wzy[4]={1,-1,0,0}; int b[100000+5]={0}; int c[100000+5]={0}; int n,m,h; bool flag=false; int main(){ int i,j,head,tail,x1,x2,y1,y2,t1,t2; cin>>n>>m>>h; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ char s; cin>>s; if(s=='#'){ a[i][j]=1; } if(s=='.'){ a[i][j]=0; } if(s=='S'){ a[i][j]=0; x1=i; y1=j; } if(s=='E'){ a[i][j]=0; x2=i; y2=j; } } } head=1; tail=2; b[1]=x1; c[1]=y1; if(b[1]==x2 && c[1]==y2){ cout<<d[x2][y2]*h; return 0; } a[x1][y1]=1; d[x1][y1]=0; while(head<tail){ for(int i=0;i<4;i++){ t1=b[head]+wzx[i]; t2=c[head]+wzy[i]; if(a[t1][t2]==0 && t1>=1 && t1<=n && t2>=1 && t2<=n){ b[tail]=t1; c[tail]=t2; a[t1][t2]=1; d[t1][t2]=d[b[head]][c[head]]+1; if(t1==x2 && t2==y2){ cout<<d[x2][y2]*h; flag=true; } tail++; } } head++; } if(flag==false) cout<<(-1); return 0; }

2024/4/15 21:12
加载中...