?? algo3-5.cpp
字號(hào):
// algo3-5.cpp 利用棧求解迷宮問(wèn)題(只輸出一個(gè)解,算法3.3)
struct PosType // 迷宮坐標(biāo)位置類型
{
int x; // 行值
int y; // 列值
};
#define MAXLENGTH 25 // 設(shè)迷宮的最大行列為25
typedef int MazeType[MAXLENGTH][MAXLENGTH]; // 迷宮數(shù)組[行][列]
// 全局變量
MazeType m; // 迷宮數(shù)組
int curstep=1; // 當(dāng)前足跡,初值為1
struct SElemType // 棧的元素類型
{
int ord; // 通道塊在路徑上的"序號(hào)"
PosType seat; // 通道塊在迷宮中的"坐標(biāo)位置"
int di; // 從此通道塊走向下一通道塊的"方向"(0~3表示東~北)
};
#include"c1.h"
#include"c3-1.h" // 采用順序棧存儲(chǔ)結(jié)構(gòu)
#include"bo3-1.cpp" // 采用順序棧的基本操作函數(shù)
// 定義墻元素值為0,可通過(guò)路徑為1,不能通過(guò)路徑為-1,通過(guò)路徑為足跡
Status Pass(PosType b)
{ // 當(dāng)迷宮m的b點(diǎn)的序號(hào)為1(可通過(guò)路徑),return OK; 否則,return ERROR。
if(m[b.x][b.y]==1)
return OK;
else
return ERROR;
}
void FootPrint(PosType a)
{ // 使迷宮m的a點(diǎn)的序號(hào)變?yōu)樽阚E(curstep)
m[a.x][a.y]=curstep;
}
PosType NextPos(PosType c,int di)
{ // 根據(jù)當(dāng)前位置及移動(dòng)方向,返回下一位置
PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; // {行增量,列增量}
// 移動(dòng)方向,依次為東南西北
c.x+=direc[di].x;
c.y+=direc[di].y;
return c;
}
void MarkPrint(PosType b)
{ // 使迷宮m的b點(diǎn)的序號(hào)變?yōu)?1(不能通過(guò)的路徑)
m[b.x][b.y]=-1;
}
Status MazePath(PosType start,PosType end) // 算法3.3
{ // 若迷宮maze中存在從入口start到出口end的通道,則求得一條
// 存放在棧中(從棧底到棧頂),并返回TRUE;否則返回FALSE
SqStack S;
PosType curpos;
SElemType e;
InitStack(S);
curpos=start;
do
{
if(Pass(curpos))
{ // 當(dāng)前位置可以通過(guò),即是未曾走到過(guò)的通道塊
FootPrint(curpos); // 留下足跡
e.ord=curstep;
e.seat.x=curpos.x;
e.seat.y=curpos.y;
e.di=0;
Push(S,e); // 入棧當(dāng)前位置及狀態(tài)
curstep++; // 足跡加1
if(curpos.x==end.x&&curpos.y==end.y) // 到達(dá)終點(diǎn)(出口)
return TRUE;
curpos=NextPos(curpos,e.di);
}
else
{ // 當(dāng)前位置不能通過(guò)
if(!StackEmpty(S))
{
Pop(S,e); // 退棧到前一位置
curstep--;
while(e.di==3&&!StackEmpty(S)) // 前一位置處于最后一個(gè)方向(北)
{
MarkPrint(e.seat); // 留下不能通過(guò)的標(biāo)記(-1)
Pop(S,e); // 退回一步
curstep--;
}
if(e.di<3) // 沒(méi)到最后一個(gè)方向(北)
{
e.di++; // 換下一個(gè)方向探索
Push(S,e);
curstep++;
curpos=NextPos(e.seat,e.di); // 設(shè)定當(dāng)前位置是該新方向上的相鄰塊
}
}
}
}while(!StackEmpty(S));
return FALSE;
}
void Print(int x,int y)
{ // 輸出迷宮的解
int i,j;
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
printf("%3d",m[i][j]);
printf("\n");
}
}
void main()
{
PosType begin,end;
int i,j,x,y,x1,y1;
printf("請(qǐng)輸入迷宮的行數(shù),列數(shù)(包括外墻):");
scanf("%d,%d",&x,&y);
for(i=0;i<x;i++) // 定義周邊值為0(同墻)
{
m[0][i]=0; // 行周邊
m[x-1][i]=0;
}
for(j=1;j<y-1;j++)
{
m[j][0]=0; // 列周邊
m[j][y-1]=0;
}
for(i=1;i<x-1;i++)
for(j=1;j<y-1;j++)
m[i][j]=1; // 定義通道初值為1
printf("請(qǐng)輸入迷宮內(nèi)墻單元數(shù):");
scanf("%d",&j);
printf("請(qǐng)依次輸入迷宮內(nèi)墻每個(gè)單元的行數(shù),列數(shù):\n");
for(i=1;i<=j;i++)
{
scanf("%d,%d",&x1,&y1);
m[x1][y1]=0; // 定義墻的值為0
}
printf("迷宮結(jié)構(gòu)如下:\n");
Print(x,y);
printf("請(qǐng)輸入起點(diǎn)的行數(shù),列數(shù):");
scanf("%d,%d",&begin.x,&begin.y);
printf("請(qǐng)輸入終點(diǎn)的行數(shù),列數(shù):");
scanf("%d,%d",&end.x,&end.y);
if(MazePath(begin,end)) // 求得一條通路
{
printf("此迷宮從入口到出口的一條路徑如下:\n");
Print(x,y); // 輸出此通路
}
else
printf("此迷宮沒(méi)有從入口到出口的路徑\n");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -