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