C++の迷路
空のスペースと壁のある迷路の中にボールがあるとします。これで、ボールは上、下、左、右などの任意の方向に転がることで空のパスを通過できますが、壁にぶつかるまで転がりが止まりません。ボールが止まると、次の方向を選択できます。
ボールの位置、目的地、迷路を開始し、ボールが目的地に止まるかどうかを確認する必要があります。迷路は1つの2D配列で表されます。ここで、1は壁を示し、0は空きスペースを示します。迷路の境界はすべて壁です。開始座標と宛先座標は、行と列のインデックスで表されます。
したがって、入力が2D配列で表される迷路のようなものである場合
0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
開始位置は(0、4)であり、宛先位置は(4、4)であり、出力はtrueになります。1つの可能な方法は-左です。 下へ 右に 。
これを解決するには、次の手順に従います-
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: bool hasPath(vector<vector<int<>& grid, vector<int<& start, vector<int<& destination) { int n = grid.size(); int m = grid[0].size(); queue<vector<int< > q; q.push(start); set<vector<int< > visited; visited.insert(start); while (!q.empty()) { vector<int< curr = q.front(); q.pop(); int x = curr[0]; int y = curr[1]; if (destination[0] == x && destination[1] == y) return true; int i = x; while (i + 1 < n && !grid[i + 1][y]) i++; if (!visited.count({ i, y })) { visited.insert({ i, y }); q.push({ i, y }); } i = x; while (i - 1 >= 0 && !grid[i - 1][y]) i--; if (!visited.count({ i, y })) { visited.insert({ i, y }); q.push({ i, y }); } i = y; while (i + 1 < m && !grid[x][i + 1]) i++; if (!visited.count({ x, i })) { visited.insert({ x, i }); q.push({ x, i }); } i = y; while (i - 1 >= 0 && !grid[x][i - 1]) i--; if (!visited.count({ x, i })) { visited.insert({ x, i }); q.push({ x, i }); } } return false; } }; main(){ Solution ob; vector<vector<int<> v = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0,1,0},{1,1,0,1,1},{0,0,0,0,0}}; vector<int< v1 = {0,4}, v2 = {4,4}; cout << (ob.hasPath(v, v1, v2)); }
入力
{{0,0,1,0,0},{0,0,0,0,0},{0,0,0,1,0},{1,1,0,1,1},{0,0,0,0,0}},{0,4},{4,4}
出力
1
-
C++のMazeII
空のスペースと壁のある迷路の中にボールがあるとします。これで、ボールは上、下、左、右などの任意の方向に転がることで空のパスを通過できますが、壁にぶつかるまで転がりが止まりません。ボールが止まると、次の方向を選択できます。 ボールの位置、目的地、迷路を開始する必要があります。ボールが目的地に停止するための最短距離を見つける必要があります。ここで、距離は実際にはボールで覆われている空のセルの数によって定義されます(開始位置を除く、開始位置を含む)。それが目的地でボールを止めることが不可能な場合は、-1を返します。 迷路は1つの2D配列で表されます。ここで、1は壁を示し、0は空きスペースを示しま
-
C++のMazeIII
空のスペースと壁のある迷路があり、その迷路の中にボールもあるとします。ボールは、上(u)、下(d)、左(l)、または右(r)の方向に転がることで空きスペースを通過できますが、壁にぶつかるまで転がり続けます。ボールが止まると、次の方向を選ぶことができます。その迷路にも1つの穴があります。ボールが穴に転がると、ボールは穴に落ちます。 したがって、ボールの位置、穴の位置、迷路がある場合、最短距離を移動することでボールがどのように穴に落ちるかを調べる必要があります。ここで、距離は、ボールがスタート(除外)からホール(含まれる)まで移動した空きスペースの数によって定義されます。 「u」、「d」、「l