我們主要通過乙個棧來實現乙個迷宮,用壓棧來記錄路徑
#pragma once
#include #include // 用全域性變數,但不是最好的方式
#define rows (6)
#define cols (6)
// 用來儲存迷宮中的座標
// 座標方向和平時不太一樣,x 朝下,y 朝右
typedef struct position;
// 棧**
#include typedef position stackdatatype;
#define max_size (100)
typedef struct stack stack;
// 初始化/銷毀
// 增(只能從棧頂)/刪(只能刪除棧頂)/查(只能檢視棧頂元素)
// 個數 / 是否空 / 是否滿
// 增 -> 順序表的尾插
// 刪 -> 順序表的尾刪
void stackinit(stack *pstack)
void stackdestroy(stack *pstack)
void stackpush(stack *pstack, stackdatatype data)
void stackpop(stack *pstack)
stackdatatype stacktop(const stack *pstack)
int stacksize(const stack *pstack)
int stackfull(const stack *pstack)
int stackempty(const stack *pstack)
void stackcopy(stack *pdest, stack *psrc)
// 棧**結束
int gmaze[rows][cols] = ,
, ,, , };
// 入口點
position gentry = ;
// 判斷是否走到出口,最後一列都是出口
int i***it(position pos)
else
}// 判定是否可以走
// 沒有越界 && 值是 1
int canpass(position pos)
if (pos.y >= cols)
return gmaze[pos.x][pos.y] == 1;
}void printpath(stack *pstack)
}stack path;
stack min;
void printmaze()
else if (gmaze[i][j] == 1)
else if (gmaze[i][j] == 2)
} printf("\n");
} printf("\n\n");
}void runmazerec(position at)
printpath(&path);
printf("*************************===\n");
//printf("找到出口: x = %d, y = %d\n", at.x, at.y);
// 重新置為 1
gmaze[at.x][at.y] = 1;
stackpop(&path);
return; // 會發生回溯
} // 根據 左 -> 上 -> 右 -> 下 來嘗試
next.x = at.x;
next.y = at.y - 1;
if (canpass(next))
next.x = at.x - 1;
next.y = at.y;
if (canpass(next))
next.x = at.x;
next.y = at.y + 1;
if (canpass(next))
next.x = at.x + 1;
next.y = at.y;
if (canpass(next))
// 重新置為 1
gmaze[at.x][at.y] = 1;
stackpop(&path);
return; // 回溯
}void runmaze()
// 根據 左 -> 上 -> 右 -> 下 來嘗試
next.x = at.x;
next.y = at.y - 1;
if (canpass(next))
next.x = at.x - 1;
next.y = at.y;
if (canpass(next))
next.x = at.x;
next.y = at.y + 1;
if (canpass(next))
next.x = at.x + 1;
next.y = at.y;
if (canpass(next))
//回溯
stackpop(&stack); // 這裡 pop 的是當前的 at
if (stackempty(&stack))
at = stacktop(&stack);
stackpop(&stack); }}
void testrunmaze1()
int main()
看一下末尾結果,看一下我們的迷宮有沒有按照正常迷宮的思維邏輯走的,遇到障礙物就不能走,遇到出口就出了,看一下最短路徑,與我們思考的最短路徑一樣不一樣
回溯過程和最短路徑都沒有什麼問題,就這樣了啊。。。。。。
迷宮最短路徑
include include using namespace std const int max n 100,max m 100 const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pairp 輸入 char maze max ...
迷宮最短路徑
問題描述 小a同學現在被困在了乙個迷宮裡面,他很想從迷宮中走出來,他可以向上 向下 向左 向右移動 每移動一格都需要花費1秒的時間,不能夠走到邊界之外。假設小a現在的位置在s,迷宮的出口在e,迷宮可能有多個出口。問小a想要走到迷宮出口最少需要花費多少秒?並輸出從起點到最近出口的路徑。任務要求 1 迷...
迷宮的最短路徑
雖然在網上找不到題目,但這題實在是太經典了,好多搜尋題目都是從它變形來的 從s走到g,不能走 測試資料 10 10 s g include include includeusing namespace std const int inf 100000000 define max n 105 defi...