Official

C - 迷路の最短経路 / Shortest Path in a Maze Editorial by physics0523


この問題は、典型的なグリッド迷路の問題です。

幅優先探索によりこの問題に正解できます。
この問題では外周に壁が敷き詰められていないため、実装の際は範囲外参照に注意してください。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;
using pi=pair<int,int>;

int dx4[4]={0,0,-1,1};
int dy4[4]={-1,1,0,0};

int N;

bool inside(pi x){
  return (0<=x.first && x.first<N && 0<=x.second && x.second<N);
}

int main(){
  cin >> N;
  vector<string> c(N);
  pi S,G;
  for(int i=0;i<N;i++){
    cin >> c[i];
    for(int j=0;j<N;j++){
      if(c[i][j]=='S'){S={i,j};}
      if(c[i][j]=='G'){G={i,j};}
    }
  }
  vector<vector<int>> d(N,vector<int>(N,1e9));
  queue<pi> q;
  d[S.first][S.second]=1;
  q.push(S);
  while(!q.empty()){
    auto od=q.front(); q.pop();
    if(od==G){
      cout << d[od.first][od.second] << "\n";
      return 0;
    }
    for(int k=0;k<4;k++){
      pi tg={od.first+dx4[k],od.second+dy4[k]};
      if(!inside(tg)){continue;}
      if(c[tg.first][tg.second]=='#'){continue;}
      if(d[tg.first][tg.second]>5e8){
        d[tg.first][tg.second]=d[od.first][od.second]+1;
        q.push(tg);
      }
    }
  }
  return 0;
}

posted:
last update: