用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

迷宫

2012-10-30 作者: 上帝是男孩举报

[c]代码库

//应用线性表解决实际问题。
//问题描述:从一个迷宫的入口到出口找出一条最短路经。用一个二维数组MAZE(1:m,
//1:n)模拟迷宫,数组元素为0 表示该位置可以通过, 数组元素为1 表示该位置不可以
//通行。MAZE(1,1)和MAZE(m,n)分别为迷宫的入口和出口。输入数据:a. 输入迷
//宫的大小m 行和n 列,两者为整数;b.由随机数产生0 或1,建立迷宫。输出数据:首
//先输出模拟迷宫的二维数组,若存在最短路经,则由出口回朔到入口打印这一条路径,
//如下所示:
//(m,n), ……, (i,j), ……, (1,1)
//如无通道,则打印:
//There is no path.

#include<stdio.h>
#include<stdlib.h>
#include"test5.h"
#include<string.h>
#include<time.h>

int main()
{
	int m,n;
	int MAZE[Max][Max],MARK[Max][Max];
	int (*p)[Max],(*q)[Max];
	unsigned char flag=0;
	LinkStack *S;
	QNode MOVE;

	p=MAZE;
	q=MARK;
	printf("输入行数和列数:\n");
	scanf("%d%d",&m,&n);

	S=CreateStack();//创建链式栈(查找数组)

	InitMOVE(&MOVE);//初始化方向数组
	InitMAZE(MAZE,m+2,n+2);//初始化迷宫
	InitMARK(MARK,m+2,n+2);//初始化标志数组
    InitStack(S);//初始化链式栈(查找数组)

	Display(MAZE,m+2,n+2);
	printf("\n\n");
	Display(MARK,m+2,n+2);
	printf("\n\n");
	flag=Index(p,q,&MOVE,S,m,n);//搜索迷宫是否有通路
    if(flag)
	{
		TraQueue(S);//输出栈中(查找数据)的数据
		printf("\n\n");
		Display(MARK,m+2,n+2);
	}
	else
		printf("there is no path!\n");

	return 0;
}

	




//////////////////////////////////////
/*           MAZE.cpp              */
/*                                 */
/*   filename:MAZE.h               */
/*   description:MAZE.h的实现文件  */
/*   designer: zhu jian            */
/*   data: 12-10-27                */
/*   QQ:505169307                  */
/////////////////////////////////////



#include<stdio.h>
#include<stdlib.h>
#include"test5.h"
#include<string.h>
#include<time.h>

LinkStack *CreateStack(void)//创建一个链式栈结点
{
	LinkStack *temp;
	temp=(LinkStack *)malloc(sizeof(LinkStack));
	if(!temp)
		return NULL;

	temp->count=0;
	return temp;
}

unsigned char InitMOVE(QNode *MOVE)//初始化方向数组MOVE
{
	QNode *p;
	p=MOVE;
	if(!MOVE)
		return ERROR;

	p->data[0][0]=-1;
	p->data[0][1]=0;

	p->data[1][0]=-1;
	p->data[1][1]=1;

	p->data[2][0]=0;
	p->data[2][1]=1;

	p->data[3][0]=1;
	p->data[3][1]=1;

	p->data[4][0]=1;
	p->data[4][1]=0;

	p->data[5][0]=1;
	p->data[5][1]=-1;

	p->data[6][0]=0;
	p->data[6][1]=-1;

	p->data[7][0]=-1;
	p->data[7][1]=-1;

	p->front=0;
	return OK;
}

unsigned char InitStack(LinkStack *S)//初始化链式栈(查找数组)
{
	LinkStack *p;
	SqStack *q;
	p=S;
	q=(SqStack *)malloc(sizeof(SqStack));
	if(!q || !S)
		return ERROR;

	q->data[0]=0;
	q->data[1]=0;
	q->next=NULL;
	p->top=q;
	return OK;
}

unsigned char InitMAZE(int p[][Max],int m,int n)//初始化迷宫
{
	int i,j;
	srand(time(0));
	if(!p)
		return ERROR;

	for(i=0,j=0;j<n;j++)
		p[i][j]=1;
	for(i=m-1,j=0;j<n;j++)
		p[i][j]=1;
	for(j=0,i=0;i<m;i++)
		p[i][j]=1;
	for(j=n-1,i=0;i<m;i++)
		p[i][j]=1;

	for(i=1;i<m-1;i++)
		for(j=1;j<n-1;j++)
			p[i][j]=rand()%2;

	p[1][1]=0;
	p[m-2][n-2]=0;
	return OK;
}

unsigned char InitMARK(int p[][Max],int m,int n)//初始化标志数组
{
	int i,j;
	if(!p)
		return ERROR;

	for(i=0,j=0;j<n;j++)
		p[i][j]=1;
	for(i=m-1,j=0;j<n;j++)
		p[i][j]=1;
	for(j=0,i=0;i<m;i++)
		p[i][j]=1;
	for(j=n-1,i=0;i<m;i++)
		p[i][j]=1;

	for(i=1;i<m-1;i++)
		for(j=1;j<n-1;j++)
			p[i][j]=0;

	return OK;
}

unsigned char Display(int S[][Max],int m,int n)//输出二维数组的数据
{
	int i,j;
	if(!S)
		return ERROR;

	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
			printf("%d ",S[i][j]);
		printf("\n");
	}

	return OK;
}

unsigned char TraQueue(LinkStack *S)//输出栈中(查找数据)的数据
{
	int i=1,num;
	LinkStack *temp;
	temp=S;
	if(!S)
		return ERROR;

	num=temp->count;
	while(i<num)
	{
		printf("(%d,%d) ",temp->top->data[0],temp->top->data[1]);
		temp->top=temp->top->next;
		i++;
	}
	
	return OK;
}

unsigned char AlterMARK(int (*MARK)[Max],int i,int j)//修改标志数组
{
	if(!MARK)
		return ERROR;

	MARK[i][j]=1;
	return OK;
}

unsigned char InsertStack(LinkStack *S,int i,int j)//将出发点插入查找链式栈中
{
	LinkStack *temp;
	SqStack *p;
	temp=S;
	if(!S)
		return ERROR;

	p=(SqStack *)malloc(sizeof(SqStack));
	if(!p)
		return ERROR;

	p->data[0]=i;
	p->data[1]=j;
	p->next=temp->top;
	temp->top=p;
	temp->count++;
	return OK;
}

unsigned char DeQNode(QNode *MOVE,int *i,int *j)//取方向数组队列的头结点(出队)
{
	QNode *temp;
	temp=MOVE;
	if(!MOVE)
		return ERROR;

	*i=temp->data[temp->front][0];
	*j=temp->data[temp->front][1];
	
	temp->front=(temp->front+1)%8;
	return OK;
}

unsigned char  Judge(int (*MAZE)[Max],int (*MARK)[Max],LinkStack *S,int *i,int *j,int *flag)//判断下一个位置是否可以通过
{
	LinkStack *temp;

	temp=S;
	if(!MAZE || !MARK || !S)
		return ERROR;

	*i=temp->top->data[0]-*i;
	*j=temp->top->data[1]+*j;
	
	if(MAZE[*i][*j]==1 || MARK[*i][*j]==1)
	{
		*flag=0;
		return ERROR;
	}

	*flag=1;
	return OK;
}

unsigned char DeStack(LinkStack *S)//删除栈(查找数组)的头结点
{
	LinkStack *temp;
	SqStack *p;
	if(!S)
		return ERROR;

	temp=S;
	p=temp->top;
	temp->top=temp->top->next;
	temp->count--;
	free(p);

	return OK;
}

unsigned char Index(int (*MAZE)[Max],int (*MARK)[Max],QNode *MOVE,LinkStack *S,int m,int n)//搜索迷宫是否有通路
{
	int i=1,j=1,num;
	int judge=0;
	QNode *Q;
	LinkStack *temp;

	Q=MOVE;//方向数组
	temp=S;//查找数组
	if(!MAZE || !MARK || !MOVE || !S)
		return ERROR;

	AlterMARK(MARK,i,j);//修改标志数组
	InsertStack(temp,i,j);//将出发点输入到查找数组中
	while(temp->top->data[0]!=m && temp->top->data[1]!=n)
	{
		num=0;
		while(num < 8)
		{
			DeQNode(Q,&i,&j);//取方向数组队列的头结点(出队)
	        Judge(MAZE,MARK,temp,&i,&j,&judge);//判断下一个结点是否可以进行
			if(judge)
				break;
		    num++;
		}
	  
		if(num >= 8)
		{
			if(temp->count == 1)
			{
				//*flag=0;
				return ERROR;
			}
			else
				DeStack(S);//删除栈(查找数组)的头结点
		}

		if(judge)
		{
			InsertStack(temp,i,j);//将出发点输入到查找数组中 
			AlterMARK(MARK,i,j);//修改标志数组
		}
	}

//*flag=1;
	return OK;
}








///////////////////////////////////
/*           MAZE.h              */
/*                               */
/*   filename:MAZE.h             */
/*   description:MAZE的头文件    */
/*   designer: zhu jian          */
/*   data: 12-10-27              */
/*   QQ:505169307                */
///////////////////////////////////


#ifndef _DATA_STRUCTURE_MAZE_H_
#define _DATA_STRUCTURE_MAZE_H_

#ifndef ERROR
#define ERROR 0	
#endif

#ifndef OK
#define OK 1
#endif

#ifndef NULL
#define NULL 0
#endif


#define Max 30//定义行列数最大值为30

typedef struct{//定义队列的循环结构体
	int data[8][2];
	int front;
}QNode;

typedef struct SqStackNode{//定义查找数组的链式栈结构体
	int data[2];
	struct SqStackNode *next;
}SqStack;

typedef struct{//定义链式栈的头指针
	SqStack *top;
	int count;
}LinkStack;

LinkStack *CreateStack(void);//创建一个链式栈结点

unsigned char InitMOVE(QNode *MOVE);//初始化方向数组MOVE

unsigned char InitStack(LinkStack *S);//初始化链式栈(查找数组)

unsigned char InitMAZE(int p[][Max],int m,int n);//初始化迷宫

unsigned char InitMARK(int p[][Max],int m,int n);//初始化标志数组

unsigned char Display(int S[][Max],int m,int n);//输出二维数组的数据

unsigned char TraQueue(LinkStack *S);//输出栈中(查找数据)的数据

unsigned char AlterMARK(int (*MARK)[Max],int i,int j);//修改标志数组

unsigned char InsertStack(LinkStack *S,int i,int j);//将出发点插入查找链式栈中

unsigned char DeQNode(QNode *MOVE,int *i,int *j);//取方向数组队列的头结点(出队)

unsigned char Judge(int (*MAZE)[Max],int (*MARK)[Max],LinkStack *S,int *i,int *j,int *flag);//判断下一个位置是否可以通过

unsigned char DeStack(LinkStack *S);//删除栈(查找数组)的头结点

unsigned char Index(int (*MAZE)[Max],int (*MARK)[Max],QNode *MOVE,LinkStack *S,int m,int n);//搜索迷宫是否有通路


#endif


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...