题解
【入门】古希腊之争
1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n,m,c,b[505][505],q[250000][3]; // x,y:出口E的坐标;t,w:BFS队列的头指针和尾指针 long long x,y,t=1,w=1; // 方向数组:分别表示上、右、下、左四个方向(索引0不用) int fx[5]={0,0,1,0,-1}; int fy[5]={0,1,0,-1,0}; // 存储迷宫地图的二维数组 char a[505][505]; int main() { // 输入迷宫的长、宽和勇士数量 cin>>n>>m>>c; // 读取迷宫地图 for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[i][j]; // 记录起点S的位置,存入BFS队列的起始位置 if(a[i][j]=='S'){ q[t][1]=i; // 队列第一个元素的x坐标 q[t][2]=j; // 队列第一个元素的y坐标 } // 记录出口E的位置坐标 else if(a[i][j]=='E'){ x=i; // 出口的x坐标 y=j; // 出口的y坐标 } } } // BFS算法:寻找从S到E的最短路径 // 当队列不为空时(头指针<=尾指针) while(t<=w){ // 遍历四个方向(上、右、下、左) for(int i=1;i<=4;i++){ // 计算新位置的坐标 int tx=q[t][1]+fx[i]; // 新x坐标 = 当前位置x + 方向x偏移 int ty=q[t][2]+fy[i]; // 新y坐标 = 当前位置y + 方向y偏移 // 判断新位置是否合法: // 1. 不是墙(#) // 2. 在迷宫范围内(x在1~n,y在1~m) // 3. 尚未访问过(b[tx][ty]为0) if(a[tx][ty]!='#'&&tx>=1&&tx<=n&&ty>=1&&ty<=m&&b[tx][ty]==0){ // 扩展队列,将新位置加入队列尾部 w++; q[w][1]=tx; // 新位置x坐标入队 q[w][2]=ty; // 新位置y坐标入队 // 记录新位置到起点的距��� = 当前位置距离 + 1(步长) b[tx][ty]=b[q[t][1]][q[t][2]]+1; // 如果到达出口E,计算总时间并输出 if(tx==x&&ty==y){ // 总时间 = 最短步数 × 勇士数量c cout<<b[tx][ty]*c; return 0; // 程序结束 } } } // 处理完当前位置,移动头指针到下一个位置 t++; } // 如果队列为空仍未找到出口,输出-1 cout<<-1; return 0; }
- 1