迷宮結構如下:
定義三個結構體,
#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...