寻找迷宫的一条出路算法

寻找迷宫的一条出路,1代表障碍,0代表通。

算法描述:

这里可以使用几种方法,我知道的有使用《数据结构》上“穷举求解”的方法,还有就是使用遗传算法寻找最优路径。这里我先简单描述下“穷举求解”,然后再做遗传算法的方式。

1 问题中要涉及走过路径的回溯,因为栈是先进后出,所以利于回溯,选择栈来存储走过路径

2 每一步有四个方向可以走,每到一步依次判断每一个方向,只要判断到某个方向可走就选择这个方向前进。

3 当所有方向都不能行进时,回溯到上一步,此时判断栈顶指针是否为-1,如果是,返回false失败,否则递归调用继续寻找。

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX_SIZE 10

int maze[MAX_SIZE][MAX_SIZE]=
{	{1,1,1,1,1,1,1,1,1,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,1,0,0,0,1,0,1},
	{1,0,0,0,0,1,1,0,0,1},
	{1,0,1,1,1,0,0,0,0,1},
	{1,0,0,0,1,0,0,0,0,1},
	{1,0,1,0,0,0,1,0,0,1},
	{1,0,1,1,1,0,1,1,0,1},
	{1,1,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1}
};
typedef struct
{
	int x;
	int y;
}POINT;

typedef struct
{
	POINT data[MAX_SIZE*MAX_SIZE];
	int top;
}STACK;

bool operator != (POINT& point1,POINT& point2)
{
	if(point1.x!=point2.x||point1.y!=point2.y)
		return true;
	else
		return false;
}
bool operator == (POINT& point1,POINT& point2)
{
	if(point1.x==point2.x&&point1.y==point2.y)
		return true;
	else
		return false;
}

bool FindWay(int maze[][MAX_SIZE],POINT start,POINT end,STACK& way)
{

	POINT step;
	step.x = start.x;
	step.y = start.y;
	if(way.data[way.top]!=end)
	{
		/************first,make sure the direction**********/
		if(maze[step.y][step.x+1]==0)	//east
		{
			maze[step.y][step.x] = 1;
			way.top++;
			way.data[way.top] = step;
			step.x++;
			FindWay(maze,step,end,way);
		}
		else if(maze[step.y+1][step.x]==0)	//south
		{
			maze[step.y][step.x] = 1;
			way.top++;
			way.data[way.top] = step;
			step.y++;
			FindWay(maze,step,end,way);
		}
		else if(maze[step.y][step.x-1]==0)	//west
		{
			maze[step.y][step.x] = 1;
			way.top++;
			way.data[way.top] = step;
			step.x--;
			FindWay(maze,step,end,way);
		}
		else if(maze[step.y-1][step.x]==0)	//north
		{
			maze[step.y][step.x] = 1;
			way.top++;
			way.data[way.top] = step;
			step.y--;
			FindWay(maze,step,end,way);
		}
		else	//There is no direction available
		{
			if(way.top<0)
				return false;
			else
			{
				maze[step.y][step.x] = 1;
				step = way.data[way.top];
				way.top--;
				FindWay(maze,step,end,way);
			}
		}//end else
	}//end if
	else
		return true;
}

int main(int argc, char* argv[])
{
	POINT start,end;
	start.x = 1;
	start.y = 1;
	end.x = 8;
	end.y = 8;
	STACK way;
	way.top = -1;
	if(FindWay(maze,start,end,way))
	{
		cout<<"Have found the way!"<<endl;
		for(int i=0;i<=way.top;i++)
			printf("(%d,%d)  ",way.data[i].x,way.data[i].y);
	}
	else
		cout<<"Don't find the way!"<<endl;
	return 1;
}


运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值