POJ3984迷宫问题

最近开始刷算法题,发现迷宫这道网上很多代码对于我这种新人都很难看懂,就把自己想了许久的解法传到博客了,有心情会

补上想法。

后注:这个方法用的不是特别好,后续BFS有更简单的写法,不过也可以对初学者理解提供一些帮助

 

#include<iostream>
#include<cstring>

using namespace std;

int maze[10][10];
int visited[10][10];
const int MAXN = 100;
struct Node
{
    int c,r;//当前的行,列坐标
    int f;// 记录父节点在队列中的下标
    Node(int cc, int rr, int ff):c(cc),r(rr),f(ff){}
    Node():c(0),r(0),f(0){}
};

Node myQueue[MAXN];

int head = 0;
int tail = 0;

// 入栈
void myEnque(Node x)
{
    myQueue[tail] = x;
    tail = (tail+1)%MAXN;// 形成循环队列
}

//判断是否为空
int isEmpty()
{
    if(head == tail) return 1;
    return 0;
}

void print(int n, int m)
{
   cout << "(" << myQueue[n].c << ", " <<  myQueue[n].r << ")" << endl;
   if(n <= m) print(n+1, m);
}

void Bfs(Node m)
{
    if(m.c == 4 && m.r == 4)
    {
        print(0,m.f);
        return;
    }
    // 向右走
    if(m.r < 4 && !maze[m.c][m.r+1] && !visited[m.c][m.r+1])
    {
        myEnque(Node(m.c,m.r+1,m.f+1));
        visited[m.c][m.r+1]=1;
        Bfs(Node(m.c,m.r+1,m.f+1));
    }

    // 向下走
    if(m.c < 4 && !maze[m.c+1][m.r] && !visited[m.c+1][m.r])
    {
        myEnque(Node(m.c+1,m.r,m.f+1));
        visited[m.c+1][m.r] = 1;
        Bfs(Node(m.c+1,m.r,m.f+1));
    }

    // 往回向左走
    if(m.r > 1 && m.r-1 >= 0 && !maze[m.c][m.r-1] && !visited[m.c][m.r-1])
    {
        visited[m.c][m.r-1]=1;
        myEnque(Node(m.c,m.r-1,m.f+1));
        Bfs(Node(m.c,m.r-1,m.f));
    }
    
    // 向上走
    if(m.c-1 >= 0 && m.c-1 >= 0 && !maze[m.c-1][m.r] && !visited[m.c-1][m.r])
    {
        myEnque(Node(m.c-1,m.r,m.f+1));
        visited[m.c-1][m.r]=1;
        Bfs(Node(m.c-1,m.r,m.f));
    }
    return;
}


int main()
{
    memset(visited,0,sizeof(visited));
    for(int i = 0; i < 5; ++i)
        for(int j = 0; j < 5; ++j)
            cin >> maze[i][j];
    Node start = Node(0,0,-1);
    myEnque(start);
    Bfs(start);
    return 0;
}

 

posted @ 2020-07-24 07:32  晓尘  阅读(159)  评论(0)    收藏  举报