前提・実現したいこと
AtCoderの深さ優先探索の問題についての質問です。以下のような迷路を入力し、ゴールまで到達可能な場合Yes、そうでない場合Noを出力する問題です。エラーは起こらないのですが、ゴールに到達可能な場合にもNoが表示されてしまいます。どこに問題があるのか教えていただきたいです。
10 10 ...s...... #########. #.......#. #..####.#. ##....#.#. #####.#.#. ..#.#.#.#. #.#g#.#.#. #.#.#.#.#. #.....#...
該当のソースコード
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 6 int H,W,sx,sy,gx,gy,X,Y; 7 8 cin>>H>>W; 9 H--;W--; 10 char raby[H][W]; 11 bool rireki[H][W];//それぞれのマスが通過済みの場合はtrueを代入する 12 for(int i = 0; i<H+1; i++){ 13 for(int j = 0; j<W+1; j++){ 14 cin>>raby[i][j]; 15 rireki[i][j]=0; 16 if(raby[i][j]=='s'){sx=i; sy=j;}//スタートの位置 17 if(raby[i][j]=='g'){gx=i; gy=j;}//ゴールの位置 18 19 } 20 } 21 const int vx[4]={1,0,-1,0};//上下左右の移動用の配列 22 const int vy[4]={0,1,0,-1}; 23 24 rireki[sx][sy]=1; 25 stack<pair<int,int>> rec; 26 27 rec.push(make_pair(sx,sy)); 28 while(rec.empty()!=1){ 29 X=rec.top().first; 30 Y=rec.top().second; 31 rec.pop(); 32 33 for(int i = 0; i<4; i++){ 34 if(raby[X+vx[i]][Y+vy[i]]=='#'||rireki[X+vx[i]][Y+vy[i]]==1)continue; 35//行先が壁だったり通過済みの場合はスルー 36 if(X+vx[i]>=H||Y+vy[i]>=W||X+vx[i]<0||Y+vy[i]<0)continue; 37//場外の場合もスルー 38 if(raby[X+vx[i]][Y+vy[i]]=='.'||raby[X+vx[i]][Y+vy[i]]=='g'){ 39 rireki[X+vx[i]][Y+vy[i]]=1; 40 rec.push(make_pair(X+vx[i],Y+vy[i])); 41 } 42 43 } 44 } 45 46 if(rireki[gx][gy]==1)cout<<"Yes"<<endl; 47 if(rireki[gx][gy]==0)cout<<"No"<<endl; 48 for(int i = 0; i<H+1; i++){ 49 for(int j = 0; j<W+1; j++){ 50 cout<<rireki[i][j]; 51 } 52 } 53}
試したこと
それぞれのマスを通過したときにrirekiに1を入れるつもりだったのですが、試しにrirekiの値を出力してみたところ、通過可能なマスに正しく1が代入できていませんでした。上のテストケースだと、一番上の行の右側の角のところまでしか1が代入されていません。他の人のコードを参考にしてみたりもしましたが、どこに問題があるのかがわかりませんでした。拙い内容で恐縮ですが、何卒解答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー