sdut数据结构实验之栈与队列十:走迷宫 栈的解法

我发现网上的题解都是dfs,我来个栈的。就是用栈来模拟dfs,也挺简单的,思路很像。

#include
#include
#include
#include

using namespace std;
const int maxn = 1e5 + 7;
int mp[10][10];
int vis[10][10];
int nextx[4] = {0, 0, 1, -1};
int nexty[4] = {1, -1, 0, 0};

struct node
{
    int x, y, z;
};

struct _stack
{
    node a[maxn];
    int pos;
    _stack()
    {
        pos = -1;
    }
    void pop()
    {
        pos--;
    }
    void push(node x)
    {
        a[++pos] = x;
    }
    node top()
    {
        return a[pos];
    }
    int siz()
    {
        return pos + 1;
    }
    bool empt()
    {
        if(pos == -1)
            return true;
        return false;
    }
};

int main()
{
   int t;
   scanf("%d", &t);
   while(t--)
   {
       int n, m;
       memset(vis, 0, sizeof(vis));
       scanf("%d%d", &n, &m);
       vis[1][1] = 1;
       for(int i = 1; i <= n; i++)
       {
           for(int j = 1; j <= m; j++)
           {
               scanf("%d", &mp[i][j]);
           }
       }
       _stack s;
       int ans = 0;
       s.push((node){1, 1, 0});
       while(!s.empt())
       {
           node k = s.top();
           s.pop();
           //printf("%d %d %d\n", k.x, k.y, k.z);
           if(k.x == n && k.y == m)
           {
               ans++;
               vis[n][m] = 0;
               continue;
           }
           int flag = 0;
           for(int i = k.z; i < 4; i++)
           {
               k.z++;
               int nx = k.x + nextx[i];
               int ny = k.y + nexty[i];
               if(!vis[nx][ny] && nx >= 1 && ny >= 1 && nx <= n && ny <= m && mp[nx][ny] == 0)
               {
                   s.push((node){k.x, k.y, k.z});
                   s.push((node){nx, ny, 0});
                   vis[nx][ny] = 1;
                   flag = 1;
                   break;
               }
           }
           if(!flag)
            vis[k.x][k.y] = 0;
       }
       printf("%d\n", ans);
   }
   return 0;
}

你可能感兴趣的:(水题)