zoukankan      html  css  js  c++  java
  • 突破障碍

    思路:采用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 ;}

  • 相关阅读:
    MySQL 5.7笔记
    Golang学习笔记
    Ubuntu使用笔记
    Linux下安装nginx和php
    Eclipse远程调试Java程序
    CentOS下glibc更新
    Linux服务器运行环境搭建(三)——MySQL数据库安装
    Linux服务器运行环境搭建(二)——Redis数据库安装
    Linux下定时任务Crontab的使用
    Linux下nginx安装与配置
  • 原文地址:https://www.cnblogs.com/gulangyuzzz/p/12503165.html
Copyright © 2011-2022 走看看