老鼠走迷宫

老鼠走迷宫

问题描述:

用矩阵(二维数组)表示迷宫,其中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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值