91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【數據結構】使用棧Stack解決迷宮問題

發布時間:2020-07-10 22:53:25 來源:網絡 閱讀:1177 作者:韓靜靜 欄目:編程語言

      我們看下面這個迷宮----方陣(也可以是矩陣):

【數據結構】使用棧Stack解決迷宮問題


     迷宮入口是坐標(2,0)位置,出口是(9,3)。我們假定0代表通路,1代表不通。


     現在需要找到哪一條路是通路。我們的思想是借助棧,“回溯法”。回溯是什么意思呢???先從起點出發,檢查它的上下左右是否是通路(即是否有為數字0處)。也就是說為0通了,壓棧,將此位置元素變成2,這樣做的好處是明確通路路徑。然后繼續往下走,判斷上下左右 。直至我們找到終點(縱坐標在矩陣的最后一行)。


     我們來看下我針對迷宮問題實現的代碼:


#include<stack>
#include<assert.h>
#define N 10    //該迷宮10*10.

struct Pos    //定義一個結構體,該結構體用來表示坐標。
{
    int _row;
    int _col;

    Pos(int row,int col)
        :_row(row)
        , _col(col)
    {}
};


template<class T>
bool SearchMazePath(int* a, int n, Pos entry, stack<T>& paths)    //尋找迷宮是否有通路。
{
    assert(a);
    
    paths.push(entry);
    while (!paths.empty())
    {
        Pos cur = paths.top();
        a[cur._row*n + cur._col] = 2;            
        if (cur._row == n - 1)
        {
            return true;
        }

        //上
         Pos tmp = cur;
        --tmp._row;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
        //下
        tmp = cur;    
        ++tmp._row;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
        //左
        tmp = cur;        
        --tmp._col;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
         //右
       tmp = cur;
        ++tmp._col;
        if (a[tmp._row*n + tmp._col] == 0)
        {
            paths.push(tmp);
            continue;
        }
        
        paths.pop();    //若上下左右都不通,則回溯。
    }
    
    return false;
}


void GetMaze(int* a, int n)    //讀取到迷宮圖案
{
    assert(a);
    FILE* fout = fopen("MazeMap.txt", "r");
    assert(fout);    //若文件打開失敗,后續工作則無法完成,因此采用assert防御式編程。
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            while (true)
            {
                int men = fgetc(fout);    //讀取字符
                if (men == '0' || men == '1')    //是0或者1則轉換成數字到二維矩陣中存儲。
                {
                    a[i*n + j] = men -'0';
                    break;    
                }                
            }
        }
    }       
}

void PrintMaze(int* a, int n)    //將此迷宮打印出來
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n;j++ )
        {
            cout << a[i*n + j] << "  ";
        }
        cout << endl;
    }
    cout << endl;
}


void Test()
{
    int a[N][N] = {};
    Pos sp(2, 0);    //入口坐標
    
    GetMaze((int*) a, N);
    PrintMaze((int*)a, N);
    stack<Pos> paths;
    
    SearchMazePath((int*)a, N, sp, paths);  
    //二維數組實際存儲是一維數組,將二維數組強制轉換為一維數組傳參。
    PrintMaze((int*)a, N);
}


int main()
{
    Test();
    system("pause");
    return 0;
}


      有時候,針對迷宮問題,我們還需要求多條路徑的最優解(最短路徑)。那這時候我們可以用壓棧,利用棧幀一層一層壓棧的特點實現。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

济阳县| 平潭县| 敦化市| 武城县| 德昌县| 微山县| 高雄市| 荔浦县| 吐鲁番市| 太仓市| 西吉县| 上思县| 司法| 象州县| 库伦旗| 昌乐县| 明星| 胶州市| 茶陵县| 龙门县| 惠州市| 延安市| 凯里市| 贡觉县| 文山县| 田阳县| 内黄县| 海宁市| 青田县| 都安| 旺苍县| 韶山市| 黎城县| 南投市| 临清市| 龙泉市| 晴隆县| 怀远县| 北宁市| 永川市| 新巴尔虎左旗|