• 1254:走出迷宫


    题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1254

    1254:走出迷宫


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 2502     通过数: 1154 

    【题目描述】

    当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。

    假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

    【输入】

    第一行是两个整数n和m(1≤n,m≤100),表示迷宫的行数和列数。

    接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.’表示空地,‘#’表示墙,‘S’表示起点,‘T’表示出口。

    【输出】

    输出从起点到出口最少需要走的步数。

    【输入样例】

    3 3
    S#T
    .#.
    ...
    

    【输出样例】

    6

    解析:
    常规BFS。
    参考代码:
    写得不大好,见谅。
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define N 101
     7 int n,m;
     8 int a[N][N];
     9 int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
    10 struct node{
    11     int h,l;
    12     int step;
    13 }q[N*N*N];
    14 using namespace std;
    15 void bfs(int i,int j)
    16 {
    17     int head=0,tail=1;
    18     q[tail].step=0;q[tail].h=i;q[tail].l=j;
    19     a[i][j]=1;
    20     do
    21     {
    22         head++;
    23         int x=q[head].l;
    24         int y=q[head].h;
    25         int step=q[head].step;
    26         
    27         for(int i=0;i<4;i++)
    28         {
    29             int nx=x+dir[i][0];
    30             int ny=y+dir[i][1];
    31             if(a[ny][nx]==3)//到终点 
    32             {
    33                 printf("%d",step+1);
    34                 return;
    35             }
    36             if(nx>0&&nx<=m&&ny>0&&ny<=n&&a[ny][nx]!=1)
    37             {
    38                 tail++;
    39                 a[ny][nx]=1;
    40                 q[tail].l=nx;
    41                 q[tail].h=ny;
    42                 q[tail].step=step+1;
    43             }
    44         }
    45     }while(head<tail);
    46 }
    47 int main()
    48 {
    49     cin>>n>>m;
    50     char c;
    51     getchar();//这里贼坑 
    52     for(int i=1;i<=n;i++)
    53     {
    54         for(int j=1;j<=m;j++)//节省空间 
    55         {
    56             scanf("%c",&c);
    57             if(c=='S') a[i][j]=2;
    58             if(c=='T') a[i][j]=3;
    59             if(c=='#') a[i][j]=1;
    60             if(c=='.') a[i][j]=0;
    61         }
    62          getchar();//这里也是贼坑 
    63     }
    64     for(int i=1;i<=n;i++)
    65     {
    66         for(int j=1;j<=m;j++)
    67         {
    68             if(a[i][j]==2)//找到起点 
    69             {
    70                 bfs(i,j);
    71                 break;
    72             }
    73         }
    74     }
    75         
    76     return 0;
    77 }

    2019-04-18 19:39:34

  • 相关阅读:
    棋盘完美覆盖数(小规模原理实现)
    Codeforces 115A Party (并查集思维)
    datetime日期和时间
    range与enumerate的区别
    爬取爱套图网上的图片
    python爬取365好书中小说
    列表和元组的方法
    字符串中的方法
    从电源问题出发,带你揭秘新体系结构范式 COA
    KubeCon 2020 演讲集锦|《阿里巴巴云原生技术与实践 13 讲》开放下载
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10731792.html
Copyright © 2020-2023  润新知