1. 程式人生 > >問題 F: DS堆疊--迷宮求解

問題 F: DS堆疊--迷宮求解

題目描述

給出一個N*N的迷宮矩陣示意圖,從起點[0,0]出發,尋找路徑到達終點[N-1, N-1]

要求使用堆疊物件來實現,具體演算法參考課本3.2.4節51頁

輸入

第一行輸入t,表示有t個迷宮

第二行輸入n,表示第一個迷宮有n行n列

第三行起,輸入迷宮每一行的每個方格的狀態,0表示可通過,1表示不可通過

輸入n行

以此類推輸入下一個迷宮

輸出

逐個輸出迷宮的路徑

如果迷宮不存在路徑,則輸出no path並回車

如果迷宮存在路徑,將路徑中每個方格的x和y座標輸出,從起點到終點,每輸出四個方格就換行,最終以單詞END結尾,具體格式參考示範資料

輸出的程式碼參考如下:

//path是儲存路徑的堆疊,堆疊中每個元素都包含x座標和y座標,用屬性xp和yp表示

//path1是一個臨時堆疊,把path的資料倒序輸出到path1,使得路徑按正序輸出

if (!path.empty()) //找到路徑

{ //......若干程式碼,實現path的資料匯入path1

i=0;  //以下是輸出路徑的程式碼

while (!path1.empty())

{ cpos = path1.top();

if ( (++i)%4 == 0 ) 

cout<<'['<<cpos.xp<<','<<cpos.yp<<']'<<"--"<<endl;

else

cout<<'['<<cpos.xp<<','<<cpos.yp<<']'<<"--";

path1.pop();

}

cout<<"END"<<endl;

}

else

cout<<"no path"<<endl; //找不到路徑輸出no path

樣例輸入

2

8

0 0 0 1 1 1 1 1

1 0 0 0 1 0 0 1

1 0 0 0 1 0 0 0

1 1 0 0 0 0 0 1

0 0 1 1 0 1 1 0

0 0 0 0 0 0 1 1

1 1 1 1 1 0 0 1

0 0 0 0 1 0 0 0

7

0 0 0 1 1 1 1

1 0 0 1 0 0 1

1 0 0 1 0 0 0

1 1 0 0 0 0 1

0 0 1 1 0 1 0

1 0 0 0 0 1 0

0 0 0 0 1 1 0

樣例輸出

[0,0]--[0,1]--[0,2]--[1,2]-- [1,3]--[2,3]--[3,3]--[3,4]-- [4,4]--[5,4]--[5,5]--[6,5]-- [6,6]--[7,6]--[7,7]--END no path

#include <iostream>
#include <queue>
#include <iterator>
#include <algorithm>
#include <iomanip>
#include <string>
#include <stack>
#include <map>
using namespace std;

typedef struct
{
    int x;
    int y;
}position;

void test(int n)
{
    int b[n][n];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            cin>>b[i][j];
    }
    stack<position> S;
    position a,temp;
    a.x=a.y=0;
    S.push(a);
    int kk=1;
    while(!S.empty())
    {
        a=S.top();
        S.pop();
        if(S.empty())
            temp=a;
        else
            temp=S.top();
        S.push(a);
        if(a.x==n-1 && a.y==n-1)
        {
            break;
        }
        if(a.x-1>=0 && b[a.x-1][a.y]==0 && a.x-1!=temp.x)
        {
            b[a.x-1][a.y]=1;
            a.x--;

            S.push(a);
            continue;
        }
        if(a.y+1<n && b[a.x][a.y+1]==0 && a.y+1 != temp.y)
        {
            b[a.x][a.y+1]=1;
            a.y++;

            S.push(a);
            continue;
        }
        if(a.x+1<n && b[a.x+1][a.y]==0 && a.x+1!=temp.x)
        {
            b[a.x+1][a.y]=1;
            a.x++;

            S.push(a);
            continue;
        }
        if(a.y-1>=0 && b[a.x][a.y-1]==0 && a.y-1!=temp.y)
        {
            b[a.x][a.y-1]=1;
            a.y--;

            S.push(a);
            continue;
        }

        b[a.x][a.y]=1;
        S.pop();
    }
    if(!S.empty())
    {
        temp=S.top();
        stack<position> T;
        while(!S.empty())
        {
            T.push(S.top());
            S.pop();
        }
        while(!T.empty())
        {
            temp=T.top();
            cout<<'['<<temp.x<<','<<temp.y<<']'<<"--";
            if(kk==4)
            {
                cout<<endl;
                kk=1;
            }
            else
                kk++;
            T.pop();
        }
        cout<<"END"<<endl;
    }
    else
        cout<<"no path"<<endl;
}

int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        test(n);
    }
}