计算机迷宫课题设计代码

  • 格式:doc
  • 大小:36.00 KB
  • 文档页数:5

#include

using namespace std;

class T

{

public:

int x;

int y;

int dir;

};

class LinkNode

{

friend class Stack;

public:

T data;

LinkNode*next;

};

class Stack

{

private:

LinkNode*top;

public:

Stack();

-Stack();

void Push(T e);

T Pop();

T GetPop();

void Clear();

bool empty();

};

Stack::Stack()

{

top=NULL;

}

Stack::-Stack()

{

}

void Stack::Push(T e)

{

LinkNode*P;

P=new LinkNode;

P->data=e;

P->next=top;

top=P;

} T Stack::Pop()

{

T Temp;

LinkNode*P;

P=top;

top=top->next;

Temp=P->data;

delete P;

return Temp;

}

T Stack::GetPop()

{

return top->data;

}

void Stack::Clear()

{

top=NULL;

}

bool Stack::empty()

{

if(top==NULL)return 1;

else return 0;

}

int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

bool Mazepath(int**maze,int m,int n);

void PrintPath(Stack p);

void Restore(int**maze,int m,int n);

int**GetMaze(int &m,int &n);

int main()

{

int m=0,n=0;

int**maze;

maze=GetMaze(m,n);

if(Nazepath(maze,m,n))

cout<<"迷宫路径探索成功!/n";

else cout<<"迷宫路径不存在!/n";

return 0;

}

int**GetMaze(int &m,int &n)

{

int**maze;

int i=0,j=0;

cout<<"请输入迷宫的长和宽:"; int a,b;cin>>a>>b;

cout<<"请输入迷宫内容:/n";

m=a;

n=b;

maze=new int*[m+2];

for(i=0;i

{

maze[i]=new int*[n+2];

}

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

cin>>maze[i][j];

for(i=0;i

maze[i][0]=maze[i][n+1]=1;

for(i=0;i

maze[0][i]=maze[m+1][i]=1;

return maze;

};

bool Mazepath(int**maze,int m,int n)

{

Stack q,p;

T Temp1,Temp2;

int x,y,loop;

Temp1.x=1;

Temp1.y=1;

q.Push(Temp1);

p.Push(Temp1);

maze[1][1]=-1;

while(!q.empty()

{

Temp2=q.GetPop();

if(!p.GetPop().x==q.GetPop().x&&p.GetPop().y==q.GetPop().y))

p.Push(Temp2);

for(loop=0;loop<4;loop++)

{

x=Temp2.x+move[loop][0];

y=Temp2.y+move[loop][1];

if(maze[x][y]==0)

{

Temp1.x=x;

Temp1.y=y;

maze[x][y]=-1;

q.Push(Temp1);

} if((x==(m))&&(y==n)))

{

Temp1.x=m;

Temp1.y=n;

Temp1.dir=0;

p.Push(Temp1);

PrintPath(p);

Restore(maze,m,n);

return 1;

}

}

if(p.GetPop().x==q.GetPop().x&&p.GetPop().y==q.GetPop().y)

{

p.Pop();

q.Pop();

}

}

return 0;

}

void PrintPath(Stack p)

{

cout<<"迷宫的路径为/n";

cout<<"括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向)/n";

Stack t;

int a,b;

T data;

LinkNode*temp;

temp=new LinkNode;

temp->data=p.Pop();

t.Push(temp->data);

delete temp;

while(!p.empty())

{

temp=new LinkNode;

temp->data=p.Pop();

a=t.GetPop().x-temp->data.x;

b=t.GetPop().y-temp->data.y;

if(a==1)temp->data.dir=1;

else if(b==1)temp->data.dir=2;

else if(a==-1)temp->data.dir=3;

else if(b==-1)temp->data.dir=4;

t.Push(temp->data);

delete temp;

} while(!t.empty())

{

data=t.Pop();

cout<<'('<

switch(data.dir)

{

case 1:cout<<"↓)/n";break;

case 2:cout<<"→)/n";break;

case 3:cout<<"↑)/n";break;

case 4:cout<<"←)/n";break;

case 0:cout<<")/n";break

}

}

}

void Restore(int**maze,int m,int n)

{

int i,j;

for(i=0;i

for(j=0;j

{

if(maze[i][j]==-1)

maze[i][j]=0;

}

}