迷宫求解(C语言)

  
任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;
要求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
 

#include <stdio.h> 

#include <stdlib.h> 

#define MAXNUM 100/* 栈中最大元素个数 */ 

#define N 11 /*地图的第一维长度*/ 



typedef struct { 

int x;/* 行下标 */ 

int y;/* 列下标 */ 

int d;/* 运动方向 */ 

} DataType; 



struct SeqStack { /* 顺序栈类型定义 */ 

int t; /* 指示栈顶位置 */ 

DataType s[MAXNUM]; 

}; 



typedef struct SeqStack *PSeqStack; /* 顺序栈类型的指针类型 */ 

PSeqStack pastack; /* pastack是指向顺序栈的一个指针变量 */ 



PSeqStack createEmptyStack_seq( void ) { 

PSeqStack pastack; 

pastack = (PSeqStack)malloc(sizeof(struct SeqStack)); 

if (pastack == NULL) 

printf("Out of space!! /n"); 

else 

pastack->t = -1; 

return pastack; 

} 



int isEmptyStack_seq( PSeqStack pastack ) { 

return pastack->t == -1; 

} 



/* 在栈中压入一元素x */ 

void push_seq( PSeqStack pastack, DataType x ) { 

if( pastack->t >= MAXNUM - 1 ) 

printf( "Overflow! /n" ); 

else { 

pastack->t++; 

pastack->s[pastack->t] = x; 

} 

} 



/* 删除栈顶元素 */ 

void pop_seq( PSeqStack pastack ) { 

if (pastack->t == -1 ) 

printf( "Underflow!/n" ); 

else 

pastack->t--; 

} 



/* 当pastack所指的栈不为空栈时,求栈顶元素的值 */ 

DataType top_seq( PSeqStack pastack ) { 

return (pastack->s[pastack->t]); 

} 



void pushtostack(PSeqStack st, int x, int y, int d) { 

DataType element; 

element.x = x; 

element.y = y; 

element.d = d; 

push_seq(st, element); 

} 



void printpath(PSeqStack st) { 

DataType element; 

printf("/n/nThe path is:/n"); 

while(!isEmptyStack_seq(st)) { 

element = top_seq(st); 

pop_seq(st); 

printf("/nthe node is: line%d arrange%d /n", element.x, element.y); /* 打印路径上的每一点 */

} 

} 



/* 迷宫maze[M][N]中求从入口maze[x1][y1]到出口maze[x2][y2]的一条路径 */ 

/* 其中 1<=x1,x2<=M-2 , 1<=y1,y2<=N-2 */ 

void mazePath(int maze[][N], int direction[][2], int x1, int y1, int x2, int y2) { 

int i, j, k, g, h; 

PSeqStack st; 

DataType element; 

st = createEmptyStack_seq( ); 

maze[x1][y1] = 2; /* 从入口开始进入,作标记 */ 

pushtostack(st, x1, y1, -1); /* 入口点进栈 */ 



while ( !isEmptyStack_seq(st)) { /* 走不通时,一步步回退 */ 

element = top_seq(st); 

pop_seq(st); 

i = element.x; j = element.y; 

for (k = element.d + 1; k <= 3; k++) { /* 依次试探每个方向 */ 

g = i + direction[k][0];h = j + direction[k][1]; 

if (g == x2 && h == y2 && maze[g][h] == 0) { /* 走到出口点 */ 

printpath(st); /* 打印路径 */ 

return; 

} 

if (maze[g][h] == 0) { /* 走到没走过的点 */ 

maze[g][h] = 2; /* 作标记 */ 

pushtostack(st, i, j, k); /* 进栈 */ 

i = g; j = h; k = -1; /* 下一点转换成当前点 */ 

} 

} 

} 

printf("/nThe path has not been found./n");/* 栈退完未找到路径 */ 

} 



int main(){ 

int direction[][2]={0,1,1,0,0,-1,-1,0}; 

int maze[][11] = { 

1,1,1,1,1,1,1,1,1,1,1, 

1,0,1,0,0,1,1,1,0,0,1, 

1,0,0,0,0,0,1,0,0,1,1, 

1,0,1,1,1,0,0,0,1,1,1, 

1,0,0,0,1,0,1,1,0,1,1, 

1,1,0,0,1,0,1,1,0,0,1, 

1,1,1,0,0,0,0,0,0,0,1,

1,1,1,1,1,1,1,1,1,1,1 

};

int x1,x2,y1,y2;

printf("/nfrom where?(line and arrange)");

printf("/ninput line and arrange(line>1,arrange>1) :");

scanf("%d %d",&x1,&y1);

printf("/nwhere to end?(line and arrange)");

printf("/ninput line and arrange(line<=6,arrange<=9) :");

scanf("%d %d",&x2,&y2);

mazePath(maze,direction,x1,y1,x2,y2);



return 0; 

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值