zoukankan      html  css  js  c++  java
  • pair求解迷宫的最短路径(bfs)

    题目描述:

    问题:给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。
    限制条件:N, M ≦100
    示例输入:
    10 10
    #S######.# 
    ......#..#
    .#.##.##.#
    .#........
    ##.##.####
    ....#....#
    .#######.#
    ....#.....
    .####.###.
    ....#...G#
     
    
    示例输出:
    22

     1 pair类型可以构造明确模板pair<T,U>对象,对组pair定义成结构体struct,而非类class
     2 pair获取第一个成员,可以使用first;
     3     获取第二个成员,可以使用second;
     4 
     5 pair在头文件<utility>中,声明如下:
     6 template <class Type1, class Type2> struct pair
     7 {
     8     typedef Type1 first_type;
     9     typedef Type2 second_type;
    10     Type1 first;
    11     Type2 second;
    12     pair();
    13     pair(const Type1& x, const Type2& y);
    14     template <class a, class b> pair(const pair<a,b>& _Right);   
    15 }
    16 
    17 make_pair()模板函数无需写型别,就可以生成一个pair对象,即将两个值作为一个pair对象参数来传递
    18 std::make_pair(42,'#');
    19 std::pair<int ,char>(42,'#');

     1 /*
     2 问题:给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,
     3 每一步可以向邻接的上下左右四格的通道移动。请求出从起
     4 点到终点所需的最小步数。请注意,本题假定从起点一定可
     5 以移动到终点。
     6 限制条件:N, M ≦100
     7 
     8 示例输入:
     9 10 10
    10 #S######.# 
    11 ......#..#
    12 .#.##.##.#
    13 .#........
    14 ##.##.####
    15 ....#....#
    16 .#######.#
    17 ....#.....
    18 .####.###.
    19 ....#...G#
    20 
    21 示例输出:
    22 22
    23 */
    24 
    25 #include <iostream>
    26 #include <queue>
    27 #include <utility>
    28 using namespace std;
    29 const int INF=1e8;
    30 const int MAXN=1005;
    31 int sx,sy;   //起点坐标
    32 int gx,gy;   //终点坐标
    33 char a[MAXN][MAXN];  //存迷宫的字符数组
    34 int vis[MAXN][MAXN]={0};    //到各个位置的最短距离设置初始化为INF
    35 int N,M;    
    36 typedef pair<int,int> P;    
    37 int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};      //4个方向的移动向量
    38 
    39 bool in(int x,int y){                           //判断是否越界
    40     return 0<=x&&x<N&&0<=y&&y<M;
    41 }
    42 //求从(sx,xy)到(gx,gy)的最短距离,无法到达就是INF
    43 int bfs(){
    44     queue<P> q;
    45     q.push(P(sx,sy));   //将起点加入队列,并初始化距离为0
    46     vis[sx][sy]=0;
    47     while(q.size()){
    48         P p=q.front();  //从队列取出第一个元素
    49         q.pop();
    50         if(p.first==gx&&p.second==gy) break;    //达到重点退出
    51         for(int i=0;i<4;i++){
    52             int dx=p.first+dir[i][0];
    53             int dy=p.second+dir[i][1];
    54             if(in(dx,dy)&&a[dx][dy]!='#'&&vis[dx][dy]==INF){
    55                 q.push(P(dx,dy));
    56                 vis[dx][dy]=vis[p.first][p.second]+1;
    57             }
    58         }
    59     }
    60     return vis[gx][gy];
    61 }
    62 void solve(){
    63     int sum=bfs();
    64     printf("%d",sum);
    65 }
    66 int main(){
    67     cin>>N>>M;
    68     for(int i=0;i<N;i++){
    69         for(int j=0;j<M;j++){
    70             cin>>a[i][j];
    71             vis[i][j]=INF;
    72             if(a[i][j]=='S'){
    73                 sx=i;
    74                 sy=j;
    75             }
    76             if(a[i][j]=='G'){
    77                 gx=i;
    78                 gy=j;
    79             }
    80         }
    81     }
    82     //scanf("%s",a);
    83     solve();
    84     return 0;
    85 }
  • 相关阅读:
    python socks5 代理服务
    F# 语言参考【摘自MSDN】
    vs2003版本的程序转换为vs2008版本时出现的一些问题及解决办法
    【转】SQL to Mongo Mapping Chart
    jQuery UI Download
    jQuery UI Multiselect
    jqGrid search oper
    apache下用expires_module让浏览器缓存静态文件
    【转】谈谈浏览器的缓存过期时间
    USACO 1.1 Friday the Thirteenth
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/13456584.html
Copyright © 2011-2022 走看看