题解 | #公共子串计算#BFS广度优先遍历

迷宫问题

http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

BFS广度优先遍历

#include<iostream>
#include<vector>
#include<list>
#include<stack>

using namespace std;

typedef struct Node
{
    int x, y;
    Node* ancestor;
    Node(int _x, int _y) :ancestor(NULL), x(_x), y(_y) {}
}Node, * LPNode;

LPNode FindSibling(vector<vector<int>>& migong, int x, int y, int hang, int lie)    //这个函数是找到当前坐标的邻居有哪些
{
    LPNode p = NULL;
    if ((x - 1 >= 0) && migong[x - 1][y] != 1)
    {
        migong[x - 1][y] = 1;                                                                                          // = 1代表已经在迷宫中遍历过了
        p = new Node(x - 1, y);
    }
    else if (y + 1 < lie && migong[x][y + 1] != 1)
    {
        migong[x][y + 1] = 1;
        p = new Node(x, y + 1);
    }
    else if (x + 1 < hang && migong[x + 1][y] != 1)
    {
        migong[x + 1][y] = 1;
        p = new Node(x + 1, y);
    }
    else if (y - 1 >= 0 && migong[x][y - 1] != 1)
    {
        migong[x][y - 1] = 1;
        p = new Node(x, y - 1);
    }
    return p;
}

int main() {
    int hang , lie;
    while(cin >> hang >> lie)
    {
        if (hang == 0 && lie == 0)
        {
            cout << "(0,0)" << endl;
            return 0;
        }
        int temp;
        vector<vector<int>> migong(hang, vector<int>(lie));
        for (int i = 0; i < hang; i++)
            for (int j = 0; j < lie; j++)
            {
                cin >> temp;
                migong[i][j] = temp;
            }
        int i = 0, j = 0;
        migong[0][0] = 1;
        LPNode p = new Node(0, 0);
        list<LPNode> l;
        list<LPNode> trash;
        l.push_back(p);
        trash.push_back(p);
        LPNode next = NULL;
        do
        {
            LPNode q = l.front();
            next = FindSibling(migong, q->x, q->y, hang, lie);
            if (next)
            {
                next->ancestor = q;
                trash.push_back(next);
                l.push_back(next);
            }
            else
            {
                l.pop_front();
            }
            if ((l.back()->x == hang - 1) && (l.back()->y == lie - 1))
                break;
        } while (!l.empty());

        stack<LPNode> s;
        next = l.back();
        while (next)
        {
            s.push(next);
            next = next->ancestor;
        }

        while (!s.empty())
        {
            cout << "(" << s.top()->x << "," << s.top()->y << ")" << endl;
            s.pop();
        }
        while(!trash.empty())    //清理内存
        {
            LPNode m = trash.front();
            trash.pop_front() ;
            delete m ;
        }
        trash.clear() ;
        l.clear() ;
    }

    return 0;
}



全部评论

相关推荐

不愿透露姓名的神秘牛友
07-01 11:27
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务