top1编程
← 返回题目
题解

【入门】古希腊之争

1 条题解

  • 0
    @ 2026-7-28 22:10:17
    #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