高分求:迷宫问题数据结构(C语言)

高分求:迷宫问题数据结构(C语言),第1张

这个迷宫路径不是唯一的,因此从不同方向开始试探执行结果也可能会不唯一。我写的是参考书上的,共有八个方向可以试探。

栈解决迷宫主要的几个问题:

1迷宫的存储

2栈的设计

3试探方向

4不重复到达某点,即不陷入死循环

如果对算法有什么疑问,或是我的回答有错误的地方,可以Hi我。

#define LINES 9 // 定义行数

#define COLS 8 // 定义列数

#include <stdioh>

#include <stdlibh>

#include <malloch>

typedef struct{

int line;

int col;

}MOVE; // 定义试探方向的结构体

MOVE to[8] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; // 定义数组,存放8个试探方向

typedef struct{ // 行、列、方向构成的三元组

int x;

int y;

int d;

}DataType;

typedef struct node{

DataType element;

struct node next;

}StackNode,LinkStack;

LinkStack InitStack(LinkStack s); // 栈初始化

LinkStack PushStack(LinkStack,DataType ); // 入栈函数

LinkStack PopStack(LinkStack,DataType ); // 出栈函数

int EmptyStack(LinkStack s); // 判定栈空

int path(int maze[][COLS+2]); // 打印路径

void printpath(LinkStack s,DataType t);

int main( void )

{

int i,j;

int maze[LINES+2][COLS+2] = // 定义存放迷宫的数组并初始化

{1,1,1,1,1,1,1,1,1,1,

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

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

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

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

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

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

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

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

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

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

};

for(i=1;i<LINES+1;i++)

{

for(j=1;j<COLS+1;j++){

if( 0 == maze[i][j] ){

printf("□");

}

else{

printf("■");

}

}

printf("\n");

}

if( path(maze) ){

printf("找到一条路径\n");

for(i=1;i<LINES+1;i++)

{

for(j=1;j<COLS+1;j++)

{

if( 0 == maze[i][j] ){

printf("□");

}

else if( 1 == maze[i][j]){

printf("■");

}

else{

printf("☆");

}

}

printf("\n");

}

}

else{

printf("迷宫无路径\n");

}

return 0;

}

LinkStack InitStack(LinkStack s)

{

return NULL;

}

LinkStack PushStack(LinkStack s,DataType t)

{

StackNode p;

p = NULL;

p = (StackNode )malloc(sizeof(StackNode));

if(!p){

printf("申请结点失败\n");

exit(1);

}

p->element = t;

p->next = s;

s = p;

return s;

}

LinkStack PopStack(LinkStack s,DataType t)

{

StackNode p = NULL;

if( EmptyStack(s) ){

printf("栈空\n");

return NULL;

}

p = s;

t = p->element;

s = s->next;

free(p);

p = NULL;

return s;

}

int EmptyStack(LinkStack s)

{

if( NULL == s ){

return 1;

}

return 0;

}

int path(int maze[][COLS+2])

{

int i,j,x1,y1,v;

DataType temp;

LinkStack top;

tempx = 1;

tempy = 1;

tempd = -1;

top = InitStack(top);

top = PushStack(top,&temp);

while( !EmptyStack(top) )

{

top = PopStack(top,&temp);

// 入口为(1,1),从0方向开始试探

x1 = tempx;

y1 = tempy;

v = tempd + 1;

while( v < 8 )

{

i = x1 + to[v]line;

j = y1 + to[v]col;

if( 0 == maze[i][j] ){ // 到达新点

tempx = x1;

tempy = y1;

tempd = v;

top = PushStack(top,&temp); // 坐标及方向入栈

x1 = i;

y1 = j;

maze[x1][y1] = -1; // 对已经到过的点做标记

if( x1 == LINES && y1 == COLS ){ // 到达出口

printpath(top,&temp); // 打印路径

return 1;

}

else{

v = 0;

}

}

else{

v++;

}

}

}

return 0;

}

void printpath(LinkStack s,DataType t)

{

while( !EmptyStack(s) )

{

printf("(%d, %d, %d)\n",s->elementx,s->elementy,s->elementd);

s = PopStack(s,t);

}

}

#include<stdioh>

int main(void)

{

int maze[100][100];

int MAZE[100][100];

int m,n;

int p,q;

printf("输入迷宫的行数m,列数n:\n");

scanf("%d%d",&m,&n);

for(p=0;p<=n+1;p++){

maze[0][p]=1;

maze[m+1][p]=1;

}

for(p=1;p<=m;p++){

maze[p][0]=1;

maze[p][n+1]=1;

printf("输入第%d行迷宫:\n",p);

for(q=1;q<=n;q++){

scanf("%d",&maze[p][q]);

MAZE[p][q]=maze[p][q];

}

}

struct location{

int row;

int col;

}way[100];

int movehoriz[8]={-1,0,1,1,1,0,-1,-1};

int movevert[8]={1,1,1,0,-1,-1,-1,0};

int endrow=m;

int endcol=n;

way[0]row=1;

way[0]col=1;

int start=3;

int i=0;

int k;

int j;

int found=0;

while(!found){

for(k=start;k<start+8;k++){

if((maze[way[i]row+movevert[k%8]][way[i]col+movehoriz[k%8]]==0)&&((i==0)||((way[i]row!=way[i-1]row)||(way[i]col!=way[i-1]col)))){

way[i+1]row=way[i]row+movevert[k%8];

way[i+1]col=way[i]col+movehoriz[k%8];

i++;

start=(k+5)%8;

break;

}

if((way[i]row==endrow)&&(way[i]col==endcol)){

break;

}

if((maze[way[i]row+movevert[k]][way[i]col+movehoriz[k]]==0)&&(way[i]row==way[i-1]row)&&(way[i]col==way[i-1]col)){

way[i]row=0;

way[i]col=0;

maze[way[i]row][way[i]col]=1;

i--;

start=(start+4)%8;

}

}

if(k>=start+8){

break;

}

if((way[i]row==endrow)||(way[i]col==endcol)){

found=1;

break;

}

}

if(found){

for(j=0;j<=i;j++){

printf("maze[%d][%d]\n",way[j]row,way[j]col);

}

}

else{

printf("The maze does not have a path\n");

}

}

QQ:366597114 不一定完全对。也许有小错误。有问题可以来问我哈

以上就是关于高分求:迷宫问题数据结构(C语言)全部的内容,包括:高分求:迷宫问题数据结构(C语言)、迷宫问题,C语言、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9456084.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存