迷宮小遊戲最短路徑的選擇

2021-09-06 02:01:45 字數 2971 閱讀 6561

我們主要通過乙個棧來實現乙個迷宮,用壓棧來記錄路徑

#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...