質問:
あなたの助けを借りて、ニンニクの頭は最終的に迷路を脱出しましたが、ニンニクの頭は喜びに没頭しませんでしたが、すぐに再び考えに落ちました、この迷路から脱出するための最小ステップ数は何ですか?
入力フォーマットの
最初の行に2つの整数nとmを入力します。これはn×m迷路であることを示します。
次の入力は、n行m列の迷路です。このうち、「S」はニンニク頭の位置を意味し、「」は壁、ニンニク頭は通過できません、「。」は道路を意味し、ニンニク頭は「。」を通過できます。「T」は迷路の出口を意味します(ニンニク頭は彼の上、下、左、右に隣接する4つの位置)。
出力形式
は、ニンニクの頭が迷路から脱出するための最小ステップ数を示す整数を出力し、ニンニクの頭が迷路から脱出できない場合は、-1を出力します。
データ範囲は
1≤n、m≤10です。
出力時の各行の終わりの余分なスペースは、回答の正確さに影響しません
入力例1
3 4 S **。 .. *。 *** T
出力例1
-1
入力例2
3 4 S **。 .... *** T
出力例2
5
コード:
#include <iostream> #include <queue> using namespace std; struct Node { int x、y、step; Node(int xx、int yy、int ss):x(xx)、y(yy)、step(ss){} }; キュー <ノード> q; bool mark [ 20 ] [ 20 ]; int n、m、beginx、beginy、endx、endy、step = 0 ; char map [ 20 ] [ 20 ]; INTの DX [ 5 ] = { 0、0、 - 1、1。}; int型のDy [ 5 ] = { - 1、1、0、0 }; // 関数境界 BOOLのチェックを(INT R&LT、INT C){ IF(R&LT> = 0 && R&LT <N - && C> = 0 && C < M ) return true ; return false ; } void BFS(int r、int c){ // 最初のステップでは、開始点をキューに入れ、ステップ数を設定しますstep = 0 q.push(Node(r、c、0 ) ); //ステップ2、見つける、空ではないキュー見つける機会持って いる間に(!Q.emptyは()) { // 第3のステップはヘッド取ることである ノードS = ; q.frontを() //が終了に見つける IF(SXを= = endx && s.y == endy) { cout << s.step << endl; return ; } else { //(int i = 0 ; i < 4 ; i ++ )の子ノード をトラバースする { int newx = s.x + dx [i]; int newy = s.y + dy [i]; // 子ノードが通過できるかどうか、通過できる場合はスタックをプッシュし、アクセスされた 場合を設定します(check(newx、newy)&&!Mark [newx] [newy] && map [newx] [newy]!= ' * ' ) { Mark [newx ] [newy] = true ; q.push(Node(newx、newy、s.step + 1 )); } } } q.pop(); } cout << " -1 " << endl; return ; } int main(){ cin >> n >> m; for(inti = 0 ; i <n; i ++ ) { cin >> map [i]; for(int j = 0 ; j <m; j ++ ) { if(map [i] [j] == ' S ' ) { beginx = i; beginy = j; } else if(map [i] [j] == ' T ' ) { endx = i; endy = j; } } } FSO(beginx、beginy); }