您的位置:首页 > 理论基础 > 数据结构算法

重回纯C数据结构,迟早要还的。。。记迷宫问题2

2011-12-31 14:19 211 查看
昨天没有想这个问题,今天在任务的就绪表卡住了,于是又想到这个迷宫问题,改写了代码,现在遇到死胡同可以自己识别出来,并且有多条路的时候也能到达出口,当然不是最优解,因此命名为0.2版本,代码如下:
#include<stdio.h>
int a,b,c,d,g=0;

char mg[6][6]=
{
	{0,0,0,0,0,1},    //6*6的迷宫,0代表可以通过,1代表不可以通过,从左上角开始,从右下角出去
	{1,1,0,1,1,1},
	{1,0,1,1,0,0},
	{0,1,1,0,1,0},
	{1,0,1,0,1,0},
	{1,1,0,1,1,0}
};
typedef struct 
{
	int shu;
	int heng;
	int name;
}move;
move m[9]=                           //有9种走法:
	{
		{-1,-1,0},           //左上
		{-1,0,1},            //正上
		{-1,1,2},            //右上
		{0,-1,3},            //左
		{0,0,4},             //中(不动)
		{0,1,5},             //右
		{1,-1,6},            //左下
		{1,0,7},             //正下
		{1,1,8},             //右下
	};
typedef struct
{
	int s;
	int h;
}position;
position p;                          //当前的位置

typedef struct
{
	int ps;
	int ph;
	int mark;
	char trace;
}PAST;
PAST past[6][6];                     //记录过去走过的位置
typedef struct
{
	int hs;
	int hh;
}history;
history his[36];           //记录前一步的位置,以供退步

void main()
{
	char e[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i',
		'j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
	p.s=0;
	p.h=0;
	for(a=0;a<6;a++)        //初始化标记全为0,即所有路都没有走过
	{
		for(b=0;b<6;b++)
		{
			past[a][b].mark=0;
		}
	}
	past[0][0].mark=1;
	while((p.s!=5)||(p.h!=5))   //当未到达出口时
	{
		int i;
		int f=0;
		for(i=0;i<9;i++)   //9个方向的走法依次试一遍
		{
			
			if(((m[i].shu+p.s)<=5)&&((m[i].shu+p.s)>=0)&&((m[i].heng+p.h)<=5)&&((m[i].heng+p.h)>=0))//如果走法未出界,即还在迷宫内
			{
				if(mg[m[i].shu+p.s][m[i].heng+p.h]==0)//如果这个走法是可以通过的路,即为迷宫的0
				{
					if(past[m[i].shu+p.s][m[i].heng+p.h].mark!=1)//如果这个走法过去没有走过
					{
						his[g].hs=p.s;
						his[g].hh=p.h;//下一步可以走了,但之前要把现在的位置记下
						p.s=m[i].shu+p.s;
						p.h=m[i].heng+p.h;
						past[p.s][p.h].mark=1;
						g++;//g是统计的走的第几步
						past[p.s][p.h].trace=e[g];
						past[p.s][p.h].ps=p.s;
						past[p.s][p.h].ph=p.h;
						break;
					}
					else f++;// 走过此路
				}
				else f++;//此路不通
			}
			else f++;//出界了

			
		}
		if(f==9)
		{
			g--;
			p.s=his[g].hs;
			p.h=his[g].hh;
			g++;
		}
	}
	
	for(c=0;c<6;c++)
	{
		printf("\n");
		for(d=0;d<6;d++)
		{
			if(past[c][d].mark==1)
			{
				printf("%c",past[c][d].trace);
			
			}
			else printf("*");
		}
		
	}
	printf("\n");
}


输出结果,唉。。。我尝试了chrome,opera,ie咋都传不了图片啊!!!

运行结果还行,只是历史记忆路径只有一次,如果死胡同需要两步才到底,则它就出不来了,还需要再修改,今天就先到这里,毕竟只是0.2版本,以后的版本还需要把函数封装一下,全用全局变量成何体统。。。祝大家元旦快乐哈~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: