資料結構之迷宮問題

2021-06-29 06:56:11 字數 3175 閱讀 7934

迷宮結構如下:

定義三個結構體,

#define _size 100		//對該迷宮,100個夠用了

#define add_size 10 //每次要增加的大小

#define endflag null //出錯時返回的標誌

#define row 8 //迷宮的行的大小,對應i

#define col 8 //迷宮的列的大小,對應j

typedef struct _listlist,*linklist;

//乙個節點的結構

typedef struct*node,_node;

typedef struct*stack,st;

int m[row][col] //迷宮布局,全域性變數

= ;

全部**如下:

#include "stdio.h"

#include "stdlib.h"

/* * 用棧解決迷宮問題

*/#define _size 100 //對該迷宮,100個夠用了

#define add_size 10 //每次要增加的大小

#define endflag null //出錯時返回的標誌

#define row 8 //迷宮的行的大小,對應i

#define col 8 //迷宮的列的大小,對應j

typedef struct _listlist,*linklist;

//乙個節點的結構

typedef struct*node,_node;

typedef struct*stack,st;

int m[row][col] //迷宮布局,全域性變數

= ;void initlist(linklist *l);

void addlist(linklist l,int value);

void dellist(linklist *l);

void createnode(_node _p[col],int i,int j);//創立乙個節點

void initstack(stack *s); //初始化棧

void destroystack(stack *s);//銷毀棧

void push(stack st,node *e);//插入元素

node* pop(stack st); //彈出棧頂元素

node* gettop(stack st); //獲得棧頂元素,並不刪除

int length(stack st); //返回棧的元素個數

int isempty(stack st); //是否為空,c語言中沒有bool型別

void initlist(linklist *l)

(*l)->data = 0;

(*l)->next = null;

}void addlist(linklist l,int value)

l = l->next; }}

//刪除鍊錶的頭節點

void dellist(linklist *l)

void createnode(_node _p[col],int i,int j)

p->x = i;

p->y = j;

p->status = 0;

initlist(&p->drit);

if( j < 7 && m[i][j+1] == 0)

addlist(p->drit,1);

if( i < 7 && m[i+1][j] == 0)

addlist(p->drit,2);

if( j > 0 && m[i][j-1] == 0)

addlist(p->drit,3);

if( i > 0 && m[i-1][j] == 0)

addlist(p->drit,4);

}void initstack(stack *s)

(*s)->top = (*s)->base;

(*s)->size = _size;

}void destroystack(stack *s)

free((*s)->base);

free(*s);

}void push(stack st,node *e)

if(!st->base)

st->top++;

*st->top = *e; }

node* pop(stack st)

node* gettop(stack st)

int isempty(stack st)

int length(stack st)

int main()

break;

case 2: //下

dellist(&(*st->top)->drit);

p = &maze[(*st->top)->x + 1][(*st->top)->y];

if(p->status == 0)

break;

case 3: //左

dellist(&(*st->top)->drit);

p = &maze[(*st->top)->x][(*st->top)->y - 1];

if(p->status == 0)

break;

case 4: //上

dellist(&(*st->top)->drit);

p = &maze[(*st->top)->x - 1][(*st->top)->y];

if(p->status == 0)

break;

default: //沒有可以遍歷的方向

(*st->top)->status = -1; //表示當前點不能走

pop(st);

} }if(isempty(st))

i =1,j=5;

while(!isempty(st))

printf("enter\n");

return 0;

}

程式輸出的路徑如下:

資料結構之迷宮問題

求迷宮問題就是求出從入口到出口的路徑。在求解時,通常用的是 窮舉求解 的方法,即從入口出發,順某一方向向前試探,若能走通,則繼續往前走 否則沿原路退回,換乙個方向再繼續 試探,直至所有可能的通路都試探完為止。為了保證在任何位置上都能沿原路退回 稱為回溯 需要用乙個後進先出的棧來儲存從入口到當前位置的...

資料結構 之迷宮問題

所謂迷宮,就是在乙個矩陣中,從開始位置有一條通路可以走到最末尾的位置 先畫乙個迷宮,格式為txt,和編譯的資料夾放在一起 在迷宮中,0表示可以走通的路,而1則表示不可走通的牆 首先定義乙個結構體,用來存放行和列 struct pos 接下來從檔案中獲得迷宮 的矩陣 void getmaze int ...

資料結構 迷宮問題

迷宮問題的總體思路是,從迷宮的入口出發,沿著某乙個方向向前試探,若能夠行得通,則繼續往前走,否則原來返回,再換另乙個方向繼續試探,直到所有可能的通路都被試探過,為了保證在任何乙個位置都能夠原來返回,需要設定乙個堆疊結構來儲存從入口到當前位置的路徑。maze.h pragma once include...