- 最初のトピック
入る
入力には、複数のテストデータセットが含まれています。入力の最初の行は整数Tです。これは、テストデータのTグループがあることを意味します。
各入力の最初の行は、2つの整数NとM(1 <= N、M <= 100)です。
次のN行で、各行にM文字を入力します。各文字は、迷路の小さな正方形を表します。
文字の意味は次のとおりです。
「S」:始点
「E」:終点「-」:
通過可能なオープンスペース
「#」:障害物、通過不可
入力データは、始点と終点が1つだけであることが保証されています。
出力
出力
入力のグループごとに、始点から終点までの最短距離を出力します。始点から終点までの道がない場合は、-1を出力します。
サンプル
入る
出力
9
問題解決のアイデアとイラスト
最初はスタックとキューの両方が使えると感じましたが、よく調べてみると問題が見つかりました!
- ここでは、パス検索の方向が右上、左下であると想定しています。
スタック図
パスファインディングの順序で順番にアクセスし、条件が満たされた場合はスタックにプッシュします
コード
#include<bits/stdc++.h>
#define ll long long
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
char mapp[105][105];
//char test[5][5] = { {'S','-','#','#','#'},{'-','-','-','-','-'},{'#','#','-','-','-',},{'E','#','-','-','-',},{'-','-','-','#','#',} };
int dex[4] = {
-1,0,1,0 };
int dey[4] = {
0,1,0,-1 };
int book[105][105] = {
0 };
typedef struct
{
int x, y, step;
}Position;
void maze(Position start, Position end, int n, int m) {
stack<Position> mystack;
start.step = 0;
mystack.push(start);
book[start.x][start.y] = 1;
Position temp = start;
while (!mystack.empty())
{
Position temp2 = mystack.top();
mystack.pop();
if (temp2.x == end.x && temp2.y == end.y) {
cout << temp2.step << endl;
return;
}
for (int i = 0; i < 4; i++) {
int dexs = temp2.x + dex[i];
int deys = temp2.y + dey[i];
if (dexs >= 0 && dexs < n && deys >= 0 && deys < m && !book[dexs][deys] && mapp[dexs][deys] != '#') {
temp.x = dexs;
temp.y = deys;
book[dexs][deys] = 1;
temp.step = temp2.step + 1;
mystack.push(temp);
}
}
}
cout << -1 << endl;
}
int main() {
int T;
Position start;
Position end;
int n, m;
while (cin >> T)
{
while (T--) {
mst(book);
mst(mapp);
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> mapp[i][j];
if (mapp[i][j] == 'S') {
start = {
i,j };
}
else if (mapp[i][j] == 'E') {
end = {
i,j };
}
}
}
maze(start, end, n, m);
}
}
return 0;
}
キュー図
コード
#include<bits/stdc++.h>
#define ll long long
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
char mapp[105][105];
//char test[5][5] = { {'S','-','#','#','#'},{'-','-','-','-','-'},{'#','#','-','-','-',},{'E','#','-','-','-',},{'-','-','-','#','#',} };
int dex[4] = {
-1,0,1,0 };
int dey[4] = {
0,1,0,-1 };
int book[105][105] = {
0 };
typedef struct
{
int x, y, step;
}Position;
void maze(Position start, Position end, int n, int m) {
queue<Position> mystack;
start.step = 0;
mystack.push(start);
book[start.x][start.y] = 1;
Position temp = start;
while (!mystack.empty())
{
Position temp2 = mystack.front();
mystack.pop();
if (temp2.x == end.x && temp2.y == end.y) {
cout << temp2.step << endl;
return;
}
for (int i = 0; i < 4; i++) {
int dexs = temp2.x + dex[i];
int deys = temp2.y + dey[i];
if (dexs >= 0 && dexs < n && deys >= 0 && deys < m && !book[dexs][deys] && mapp[dexs][deys] != '#') {
temp.x = dexs;
temp.y = deys;
book[dexs][deys] = 1;
temp.step = temp2.step + 1;
mystack.push(temp);
}
}
}
cout << -1 << endl;
}
int main() {
int T;
Position start;
Position end;
int n, m;
while (cin >> T)
{
while (T--) {
mst(book);
mst(mapp);
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> mapp[i][j];
if (mapp[i][j] == 'S') {
start = {
i,j };
}
else if (mapp[i][j] == 'E') {
end = {
i,j };
}
}
}
maze(start, end, n, m);
}
}
return 0;
}
差
キューとスタックの宣言とコンテナの最上位要素の取得方法のみが
変更されていますが、変更はひどいものです。
ここで私は時間を犠牲にして私と一緒に勉強してくれたtxのボスに感謝したいと思います-