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