[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