當前位置:編程學習大全網 - 編程語言 - 迷宮1編程

迷宮1編程

/*註意:本程序探索迷宮的優先級= & gt1-下,2-右,3-上,4-左

# 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 ");

}

  • 上一篇:我這是不是亞健康狀態
  • 下一篇:編程計算閏月
  • copyright 2024編程學習大全網