Advertisement

上海计算机学会2023年12月月赛C++丙组T4迷宫

阅读量:

迷宫

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定 n×m 个方格构成的图,每个格子都有一种地形:

  • 有一些格子是墙,以符号 # 表示,墙不可通行。
  • 有一些格子是空地,以符号 . 表示,空地可以通行。

请计算,从左上角的方格出发,最少需要移动多少步才能到达右下角的方格。在移动过程中,不能进入地形为墙的方格,保证起点与终点方格地形不是墙。且移动时,只能移动到水平或垂直方向相邻的方格。

输入格式
  • 第一行:单个整数 n 与 m
  • 第二行到第 n+1 行:第 i+1 行每行有 m 个整数表示第 i 行的地形
输出格式
  • 单个整数,表示起点到终点最短路径长度
  • 若无解,输出 No solution
数据范围
  • 30% 的数据,1≤n,m≤4
  • 60% 的数据,1≤n,m≤10
  • 100% 的数据,1≤n,m≤1000
样例数据

输入:
4 5
.#...
.#.#.
.#.#.
...#.

输出:
13

输入:
3 3
..#
.#.
#..
输出:
No solution

解析:宽度优先搜索,详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int n,m;
    
 char a[1005][1005];//地图
    
 int b[1005][1005];//走到这个位置最少用几步
    
 int dx[4]={0,0,-1,1};//四个方向
    
 int dy[4]={-1,1,0,0};
    
 struct node{
    
     int x,y;
    
 };
    
 queue <node> q;//队列
    
 int main() {
    
     cin>>n>>m;
    
     for(int i=1;i<=n;i++){
    
     for(int j=1;j<=m;j++){
    
         cin>>a[i][j];
    
     }
    
     }
    
     node t;
    
     t.x=1;t.y=1;
    
     q.push(t);//起点入队
    
     while (!q.empty()){
    
     int x=q.front().x;//队首出队
    
     int y=q.front().y;
    
     q.pop();
    
     for(int i=0;i<4;i++){//枚举四个方向
    
         int xx=x+dx[i];
    
         int yy=y+dy[i];
    
         //不出界且不是墙,也没走过
    
         if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]=='.'&&b[xx][yy]==0){
    
             b[xx][yy]=b[x][y]+1;//计算步数
    
             t.x=xx;
    
             t.y=yy;
    
             q.push(t);//入队
    
         }
    
     }
    
     }
    
     if(b[n][m]==0){
    
     cout<<"No solution";
    
     }else{
    
     cout<<b[n][m];
    
     }
    
     return 0;
    
 }
    
    
    
    

全部评论 (0)

还没有任何评论哟~