突破障碍

思路:采用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\n",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\n",ans) ;return 0 ;}

 

posted @ 2020-03-16 13:01  gulangyuzzz  阅读(208)  评论(0编辑  收藏  举报