老鼠走迷宫
问题描述:
用矩阵(二维数组)表示迷宫,其中1表示墙,0表示通路。老鼠在左上角,要走到迷宫右下角。
方法一: (堆栈实现)
#include<iostream>
#include<cstdlib>
#define EAST MAZE[x][y+1] /*定义东方的相对位置*/
#define WEST MAZE[x][y-1] /*定义西方的相对位置*/
#define SOUTH MAZE[x+1][y] /*定义南方的相对位置*/
#define NORTH MAZE[x-1][y] /*定义北方的相对位置*/
#define ExitX 8 /*定义出口的X坐标在第8行*/
#define ExitY 10 /*定义出口的Y坐标在第10列*/
using namespace std;
typedef struct List{
int x,y;
struct List* next;
}Node,*Link;
int MAZE[10][12] = {2,1,1,1,1,0,0,0,1,1,1,1, /*声明迷宫数组*/
1,0,0,0,1,1,1,1,1,1,1,1,
1,1,1,0,1,1,0,0,0,0,1,1,
1,1,1,0,1,1,0,1,1,0,1,1,
1,1,1,0,0,0,0,1,1,0,1,1,
1,1,1,0,1,1,0,1,1,0,1,1,
1,1,1,0,1,1,0,1,1,0,1,1,
1,1,1,0,1,1,0,0,1,0,1,1,
1,1,0,0,0,0,0,0,1,0,0,1,
1,1,1,1,1,1,1,1,1,1,1,3};
//把位置坐标(x,y)入栈,以保存路径
Link push(Link stack,int x,int y)
{
Link newnode=(Link)malloc(sizeof(Node));
if(!newnode)
{
cout<<"内存分配失败"<<endl;
return NULL;
}
newnode->x=x;
newnode->y=y;
newnode->next=stack;
stack=newnode;
return stack;
}
//对不可行的位置进行出栈操作,x、y保存的是当前不可行位置的坐标
//这样做的目的是满足:走过的路不会再走第二次
Link pop(Link stack,int* x,int* y)
{
Link top;
if(stack!=NULL)
{
top=stack;
stack=stack->next;
*x=top->x;
*y=top->y;
free(top);
return stack;
}
else
*x--; //
return stack;
}
int checkExit(int x,int y,int ex,int ey)
{
if(x==ex&&y==ey)
return 1;
return 0;
}
int main()
{
int i,j,x,y;
Link path=NULL;
x=1; /*入口的X坐标*/
y=1; /*入口的Y坐标*/
cout<<"[迷宫的地模拟图(0表示墙,2表示入口,3表示出口]"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<12;j++)
cout<<" "<<MAZE[i][j];
cout<<endl;
}
while(x<=ExitX&&y<=ExitY)
{
MAZE[x][y]=6; //把当前位置置为6,表示已经走过
if(NORTH==0) //如果往NORTH方向可走,则向该方向走,并把新位置入栈,以下亦如此
{
x--;
path=push(path,x,y);
}
else if(SOUTH==0)
{
x++;
path=push(path,x,y);
}
else if(WEST==0)
{
y--;
path=push(path,x,y);
}
else if(EAST==0)
{
y++;
path=push(path,x,y);
}
else if(checkExit(x,y,ExitX,ExitY)==1) //检查是否到达出口
break;
else //碰到墙了,则往回退一格
{
MAZE[x][y]=2;
path=pop(path,&x,&y);
}
}
cout<<"---------------------------"<<endl;
cout<<"[*表示老鼠走过的路线]"<<endl; /*打印出老鼠走完迷宫后的路径图*/
cout<<"---------------------------"<<endl;
for(i=0;i<10;i++)
{
for(j=0;j<12;j++)
{
cout<<" ";
if(MAZE[i][j]==6)
cout<<"*";
else
cout<<"O";
}
cout<<endl;
}
return 0;
}