迷宮問題(bfs)

【題目描述】
定義一個二維數組:

int maze[5][5] = {
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};
它表示一個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫着走或豎着走,不能斜着走,要求編程序找出從左上角到右下角的最短路線。

【輸入】
一個5 × 5的二維數組,表示一個迷宮。數據保證有唯一解。

【輸出】
左上角到右下角的最短路徑,格式如樣例所示。

【輸入樣例】
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
【輸出樣例】
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
題目分析:
剛看到這個題想到可以用二維數組來記錄當前點的上一個點,最後想到了用結構體來分別記錄了橫縱座標。
我們在搜索的時候就是在正常搜索的基礎上稍微修改一下即可,添加一個結構體記錄的環節。
還有千萬不要忘記把走過的點覆蓋掉,不然你肯定會像我一樣五分鐘打完代碼,半小時一直在找哪裏錯!!
代碼:

#include<iostream>
#include<queue>
using namespace std;
int tu[5][5];//地圖
int d[4][2]={1,0,-1,0,0,1,0,-1};//四個方向
struct lu{//路徑結構體
  int nx,ny;
}a[100][100];//結構體的二維數組
void bfs(int,int);//搜索
void print(int,int);//輸出函數
int main()
{
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
        cin>>tu[i][j];//數據輸入
    bfs(0,0);//從0,0開始搜索
    print(4,4);//輸出4,4的上一步,之後遞歸進行
    return 0;
}
void bfs(int x,int y)
{
    queue<int>sx,sy;
    sx.push(x);//入隊操作
    sy.push(y);
    a[sx.front()][sy.front()].nx=-1;//對初始點的上一個點賦值爲-1代表沒有上一個點
    a[sx.front()][sy.front()].ny=-1;
    tu[x][y]=1;//千萬不要忘記!!細心很重要!
    while(!sx.empty()&&!sy.empty())//隊列非空時進行
    {
        for(int i=0;i<4;i++)//四個方向
        {
            int xx=sx.front()+d[i][0];//移動
            int yy=sy.front()+d[i][1];
            if(xx>=0&&xx<5&&yy>=0&&yy<5&&!tu[xx][yy])//越界以及是否走過
            {
                sx.push(xx);//入隊
                sy.push(yy);
                tu[xx][yy]=1;//覆蓋
                a[xx][yy].nx=sx.front();//記錄上一個點
                a[xx][yy].ny=sy.front();
                if(xx==4&&yy==4) return;//到達終點則返回
            }
        }
        sx.pop();//出隊
        sy.pop();
    }
}
void print(int x,int y)
{
    if(a[x][y].nx==-1&&a[x][y].ny==-1)//到達初始點則輸出0,0.不要忘記返回!
    {
        cout<<"(0, 0)"<<endl;
        return;
    }
        print(a[x][y].nx,a[x][y].ny);//遞歸進行輸出上一個點
    cout<<"("<<x<<", "<<y<<")"<<endl;
    return;
}

結果:

輸入:
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出:
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

Process returned 0 (0x0)   execution time : 7.880 s
Press any key to continue.
發佈了31 篇原創文章 · 獲贊 27 · 訪問量 8749
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章