# include & ltstdio.h & gt
# include & ltstdlib.h & gt
# include & lttime.h & gt
#define stack_init_size 200
#define stack_increment 10
#定義溢出0
#定義OK 1
#定義錯誤0
#定義真1
#定義假0
typedef int狀態;
typedef結構{
int x;
int y;
} PosType
typedef結構{
int順序;//路徑上通道塊的“序列號”。
後置式座椅;//迷宮中通道塊的“坐標位置”
int di//從這個通道塊到下壹個通道塊的“方向”
} SElemType
typedef結構{
SElemType * base
SElemType * top
int stacksize
} SqStack
int mg[20][20];
/*隨機生成迷宮的功能
/*為了盡可能的通過,可以通過的塊數與不能通過的塊數之比大致為2:1*/
void Random(){
int i,j,k;
srand(time(NULL));
mg[1][0]= mg[1][1]= mg[18][19]= 0;//將入口和出口設置為“0”即可通過。
for(j = 0;j & lt20;j++)
mg[0][j]= mg[19][j]= 1;/*在迷宮外圍設置“禁止行走”,確保只有壹個出口和入口*/
for(I = 2;我& lt19;i++)
mg[I][0]= mg[I-1][19]= 1;/*在迷宮外圍設置“禁止行走”,確保只有壹個出口和入口*/
for(I = 1;我& lt19;i++)
for(j = 1;j & lt19;j++){
k = rand()% 3;//隨機生成三個數:0,1,2。
如果(k)
mg[I][j]= 0;
否則{
if((I = = 1 & amp;& ampj = = 1)| |(I = = 18 & amp;& ampJ==18)) /*因為離入口或出口壹步之遙的路是必經之路,所以將通道塊設置為“0”以增加迷宮可以通過的概率*/
mg[I][j]= 0;
其他
mg[I][j]= 1;
}
}
}
//構造壹個空堆棧
狀態init stack(sq stack & amp;s){
s . base =(selem type *)malloc(stack _ init _ size * sizeof(selem type));
如果(!s.base)返回溢出;
s . top = s . base;
s.stacksize = stack _ init _ size
退貨OK;
}
//當前塊可以通過嗎?
狀態通過(e類郵件){
If (mg[e.x][e.y]==0) //0可以通過。
退貨OK;//如果當前位置可以通行,返回1。
返回溢出;//其他條件返回0。
}
//留下足跡。
狀態足跡(郵政類型e){
mg[e . x][e . y]= 7;
退貨OK;
}
//推入堆棧
狀態推送(SqStack & amps,選擇類型e){
if(s . top-s . base & gt;=s.stacksize){
s . base =(selem type *)realloc(s . base,(s . stack size+stack _ increment)* sizeof(selem type));
如果(!s.base)退出(溢出);
s . top = s . base+s . stack size;
s . stack size+= stack _ increment;
}
* s . top++ = e;
退貨OK;
}
//退出堆棧
狀態彈出(SqStack & amps,選擇類型& ampe){
if(s.top==s.base)
返回ERROE
e = *-s . top;
退貨OK;
}
//下壹步
後置型NextPos(後置型& ampe,int dir){
後置E型;
開關(方向){
案例1:e . x = e . x;//向下
e . y = e . y+1;
打破;
情況二:e . x = e . x+1;//到右邊
e . y = e . y;
打破;
案例三:e . x = e . x;//向上
e . y = e . y-1;
打破;
案例四:e . x = e . x-1;//向左
e . y = e . y;
打破;
}
返回E;
}
//棧是空的嗎?
狀態堆棧屬性(SqStack s){
if (s.top==s.base)
退貨OK;
返回溢出;
}
//留下無法通過的足跡。
狀態標記打印(e型郵政){
mg[e . x][e . y]= 3;
退貨OK;
}
//迷宮功能
//如果迷宮中有壹條從入口起點到出口終點的通道,找到壹條,存入棧中。
//(從堆棧底部到頂部)並返回TRUE;否則返回FALSE。
狀態MazePath(int mg,PosType start,PosType end,SqStack & amps){
後置型curpos
InitStack
選擇e型;
int curstep
curpos =開始;//將“當前位置”設置為“入口位置”
curstep = 1;//探索第壹步
做{
If(Pass(curpos)){ //當前位置可以通過,即從未到達的通道塊。
足跡(curpos);//留下足跡
e . di = 1;
e.ord = curstep
e.seat = curpos
推(s,e);//添加路徑
if(curpos . x = = end . x & amp;& ampcurpos.y==end.y){
Printf("\n\n0∩_∩0可以到達終點!");
返回TRUE
}
curpos=NextPos(curpos,1);//下壹個位置是當前位置的東鄰居。
cur step++;//探索下壹步
}
Else{ //當前位置不能通過。
如果(!堆棧屬性){
Pop(s,e);
while(e . di = = 4 & amp;& amp!堆棧屬性){
mark print(e . seat);
Pop(s,e);
}
if(e . di & lt;4){
e . di++;
推(s,e);//留下過不去的印記,退壹步。
curpos=NextPos(e.seat,e . di);/*當前位置設置為新方向的相鄰塊*/
}//如果
}//如果
}//否則
}while(!StackEmpty(s));
printf(" \ n \ n抱歉!不能到達終點!”);
返回FALSE
}
//打印迷宮
void PrintMaze(){
int i,j;
Printf("運行路徑:\ n \ n ");
for(I = 0;我& lt20;i++){
for(j = 0;j & lt20;j++){
if(mg[I][j]= = 0)printf(" ");
else if(mg[I][j]= = 1)printf("■");//迷宮的“墻”
else if(mg[I][j]= = 3)printf("◇;");//無法通行的道路
else if(mg[I][j]= = 7)printf("○");//路徑通過
}
printf(" \ n ");
}
printf(" \ n ");
}
void main(){
sq stack S;
PosType開始,結束;
start . x = 1;start . y = 0;//起點坐標
end . x = 18;end . y = 19;//終端坐標
printf(" \ n = = = = = = = = = = =迷宮遊戲= = = = = = = = = = = = = = ");
Printf ("\ nDescription: ■不可進入區域\t◇不可進入區域");
Printf("\n' space '代表聞所未聞的領域");
Printf ("\ n χ表示可以通過的路徑,指向終點");
printf(" \ n = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ");
random();
printf(" \ n \ nTest 1:");
MazePath(mg[20][20],start,end,S);
print maze();
系統(“暫停”);
random();
printf(" \ nTest 2:");
MazePath(mg[20][20],start,end,S);
print maze();
系統(“暫停”);
random();
printf(" \ nTest 3:");
MazePath(mg[20][20],start,end,S);
print maze();
Printf ("\ n = = = = = =程序退出,感謝使用!= = = = = = = = = = = \ n ");
}