//应用线性表解决实际问题。 |
//问题描述:从一个迷宫的入口到出口找出一条最短路经。用一个二维数组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 |