グラフィカルな単純な迷路の問題(c ++)

  • 最初のトピック

入る

入力には、複数のテストデータセットが含まれています。入力の最初の行は整数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のボスに感謝したいと思います-

おすすめ

転載: blog.csdn.net/qq_43477024/article/details/109659363