数据布局之栈的应用----迷宫

    添加时间:2013-6-11 点击量:

    这个用到了一些C++的常识了,因为须要用到动态建树数组和类的一些常识。


    以前碰到类似的题目就很头疼,并且也不肯意去写,可是如今感觉只要肯花时候,


    写起来并不那么艰苦,固然一次性完美的写出来,不失足不成能,然则在调试错误的过程中同样能感触感染到康乐。


    推敲到节俭时候,我就随机生成了一个地图,矩阵的大小可以输入。1为可走,0为走不通。


    代码并没有完美到我想要的目标,例如今朝只能寻找一条路线,多条路线还没有思路。


    代码的首要思惟就是压栈和出栈



    /
    
    > File Name: maze.cpp
    > Author: Darin
    > Mail: dyy726@qq.com
    > Created Time: 2013年06月08日 礼拜四 06时36分24秒
    /
    #include
    <iostream>
    #include
    <stdlib.h>
    #include
    <time.h>
    using namespace std;
    #define orientationNum 4
    int MazeMapLineNumber = 0;
    typedef
    struct Position {
    int xcoordinate;
    int ycoordinate;
    }POSITION;

    typedef
    struct Node {
    POSITION Pos;
    struct Node pNext;
    }NODE,
    PNode;

    class CStack {
    public:
    PNode pTop;
    PNode pBottom;
    public:
    CStack();
    bool IsNull();
    void Push(POSITION pos);
    void Pop();
    POSITION GetTop();
    void clear();
    void ShowWay();
    ~CStack();
    };

    CStack::CStack(){
    pTop
    = pBottom = new NODE;
    pTop
    ->pNext = NULL;
    }

    bool CStack::IsNull() {
    if (pTop == pBottom)
    return true;
    return false;
    }

    void CStack::Push(POSITION pos) {
    PNode p
    = new NODE;
    p
    ->Pos = pos;
    p
    ->pNext = pTop;
    pTop
    = p;
    }

    void CStack::Pop(){
    if(!IsNull()) {
    PNode p
    = pTop;
    pTop
    = p->pNext;
    (p);
    }
    else cout<<The stack is null <<endl;
    }

    void CStack::ShowWay() {
    PNode p
    = pTop;
    while(p->pNext != pBottom) {
    cout
    <<<<p->Pos.xcoordinate<<<<p->Pos.ycoordinate<<) -> ;
    p
    = p->pNext;
    }
    cout
    <<<<p->Pos.xcoordinate<<<<p->Pos.ycoordinate<<;
    }

    POSITION CStack::GetTop() {
    return pTop->Pos;
    }

    void CStack::clear() {
    while(!IsNull()) Pop();
    }

    CStack::
    ~CStack() {
    clear();
    }
    bool isOutOfborder(POSITION pos) {
    if(pos.ycoordinate<0 || pos.ycoordinate>=MazeMapLineNumber
    ||pos.xcoordinate<0 || pos.xcoordinate>=MazeMapLineNumber)
    return true;
    return false;
    }

    bool isequal(POSITION pos1,POSITION pos2) {
    if(pos1.xcoordinate == pos2.xcoordinate &&
    pos1.ycoordinate
    == pos2.ycoordinate) return true;
    return false;
    }

    void PassMaze(int map,POSITION Inpos,POSITION OutPos) {
    CStack
    MazeWay = new CStack();
    POSITION CurPos
    = OutPos;
    POSITION NewPos;
    int i =0;
    bool IsFind = false;
    MazeWay
    ->Push(CurPos);
    while((!MazeWay->IsNull())&&(!isequal(CurPos,Inpos))) {
    //(!isOutOfborder(CurPos))
    CurPos = MazeWay->GetTop();
    IsFind
    = false;
    for(i=0;i<orientationNum;i++) {
    if0 == i) {
    //right
    NewPos.xcoordinate = CurPos.xcoordinate;
    NewPos.ycoordinate
    = CurPos.ycoordinate+1;
    }
    if1 == i) {
    //down
    NewPos.xcoordinate = CurPos.xcoordinate+1;
    NewPos.ycoordinate
    = CurPos.ycoordinate;
    }
    if2 == i) {
    //left
    NewPos.xcoordinate = CurPos.xcoordinate;
    NewPos.ycoordinate
    = CurPos.ycoordinate-1;
    }
    if3 == i) {
    //up
    NewPos.xcoordinate = CurPos.xcoordinate-1;
    NewPos.ycoordinate
    = CurPos.ycoordinate;
    }

    if(!isOutOfborder(NewPos) && map[NewPos.xcoordinate][NewPos.ycoordinate]) {
    IsFind
    = true;
    CurPos
    = NewPos;
    map[NewPos.xcoordinate][NewPos.ycoordinate]
    = 0;
    break;
    }
    }
    if(IsFind) {
    MazeWay
    ->Push(CurPos);
    }
    else MazeWay->Pop();

    }
    if(MazeWay->IsNull()) {
    cout
    <<There is no way to go out of the maze<<endl;
    }
    else MazeWay->ShowWay();
    }

    int main() {
    int i=0,j=0;
    srand((unsigned)time(NULL));
    cout
    <<Please input the row of the maze map:;
    cin
    >>MazeMapLineNumber;
    POSITION inpos;
    POSITION outpos;

    int pMap = new int [MazeMapLineNumber];
    for (i=0;i<MazeMapLineNumber;i++) {
    pMap[i]
    = new int [MazeMapLineNumber];
    }

    for (i=0;i<MazeMapLineNumber;i++) {
    for (j=0;j<MazeMapLineNumber;j++) {
    pMap[i][j]
    = rand()%2;
    cout
    <<pMap[i][j]<< ;
    }
    cout
    <<\n;
    }

    // for (i=0;i<MazeMapLineNumber;i++) {
    // for (j=0;j<MazeMapLineNumber;j++) {
    // cout<<pMap[i][j]<< ;
    // }
    // cout<<\n;
    // }

    cout
    <<Please input inpos.x :;
    cin
    >>inpos.xcoordinate;
    cout
    <<Please input inpos.y :;
    cin
    >>inpos.ycoordinate;
    cout
    <<Please input outpos.x :;
    cin
    >>outpos.xcoordinate;
    cout
    <<Please input outpos.y :;
    cin
    >>outpos.ycoordinate;
    PassMaze(pMap,inpos,outpos);

    return 0;
    }


    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: