• 突破障碍


    思路:采用deque作为队列进行bfs,如果当前的格子是障碍物,则距离加1,放到队列的尾部;

    如果当前的格子是空地,那么距离不变,把当前点放到队列的头部

    (类似于只有0,1两种权值求最短的问题)

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std ;
    
    const int N = 310 ;
    
    char g[N][N] ;
    int n, m ;
    
    bool st[N][N] ;
    int x11,y11,x2,y2 ;
    
    struct node{
        int l,r,cnt ;
    };
    
    int dx[] = {-1,1,0,0}, dy[] = {0,0,1,-1} ;
    
    int bfs(){
        deque<node> dq ;
        dq.push_front({x11,y11,0}) ;
        while(dq.size()){
            node ele = dq.front() ;
            dq.pop_front() ;
            int x = ele.l, y = ele.r, cnt = ele.cnt ;
            if(x == x2 && y == y2) return cnt ;
            st[x][y] = true ;
            
            for(int i=0;i<4;i++){
                int a = x + dx[i], b = y + dy[i] ;
                if(a<0 || a>=n || b<0 || b>=m) continue ;
                if(st[a][b]) continue ;
                if(g[a][b] == '.' || g[a][b] == 'T'){
                    dq.push_front({a,b,cnt}) ;
                }else{
                    dq.push_back({a,b,cnt+1}) ;
                }
            }
        }
    }
    
    int main(){
        scanf("%d%d",&n,&m) ;
        
        for(int i=0;i<n;i++){
            scanf("%s",g[i]) ;
        }
        
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(g[i][j] == 'S'){
                    x11 = i ;
                    y11 = j ;
                }
                if(g[i][j] == 'T'){
                    x2 = i ;
                    y2 = j ;
                }
            }
        }
        
        int ans = bfs() ;
        
        printf("%d
    ",ans) ;
        
        return 0 ;
        
    }

    ...

    #include <iostream>#include <cstring>#include <algorithm>#include <queue>
    using namespace std ;
    const int N = 310 ;
    char g[N][N] ;int n, m ;
    bool st[N][N] ;int x11,y11,x2,y2 ;
    struct node{int l,r,cnt ;};
    int dx[] = {-1,1,0,0}, dy[] = {0,0,1,-1} ;
    int bfs(){deque<node> dq ;dq.push_front({x11,y11,0}) ;while(dq.size()){node ele = dq.front() ;dq.pop_front() ;int x = ele.l, y = ele.r, cnt = ele.cnt ;if(x == x2 && y == y2) return cnt ;st[x][y] = true ;for(int i=0;i<4;i++){int a = x + dx[i], b = y + dy[i] ;if(a<0 || a>=n || b<0 || b>=m) continue ;if(st[a][b]) continue ;if(g[a][b] == '.' || g[a][b] == 'T'){dq.push_front({a,b,cnt}) ;}else{dq.push_back({a,b,cnt+1}) ;}}}}
    int main(){scanf("%d%d",&n,&m) ;for(int i=0;i<n;i++){scanf("%s",g[i]) ;}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(g[i][j] == 'S'){x11 = i ;y11 = j ;}if(g[i][j] == 'T'){x2 = i ;y2 = j ;}}}int ans = bfs() ;printf("%d ",ans) ;return 0 ;}

  • 相关阅读:
    Android Fragment(一)
    Android github上的好的开源项目汇总
    Android ScrollView 嵌套ListView的替代方案
    Android cannot be cast to android.app.Fragment
    js css加时间戳
    WPF无边框实现拖动效果
    分析器错误消息: 未能加载类型
    微信红包功能(含示例demo)
    ABP缓存示例
    微信白名单配置与检验
  • 原文地址:https://www.cnblogs.com/gulangyuzzz/p/12503165.html
Copyright © 2020-2023  润新知