走迷宮,帶起點終點 .
有傳送門,傳送門個數不超過 \(26\) 個 .
不會 .
我們可以考慮把每個點能到的點連邊 .
二維壓到一維,常見 trick .
於是我們有乙個很顯然的想法:點到傳送門連 \(0\) 權值的邊 .
但是這樣是錯的,因為我們經過傳送門必須得進去 .
紅色是邊,藍色是最短路 .
於是如果乙個點能到傳送門,我們就直接把傳送門能到的點和它連邊,這樣就好了 .
注意要嚴格連單向邊 .
這樣每條邊的權值就都是 \(1\) 了,bfs 也能求最短路了 .
顯式建圖的 bfs 顯然跑不過直接 bfs 啊/kk
#include #include #include #include #include #include #include #include #include #include #include #define file(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout);
using namespace std;
typedef pairpii;
const int rn = 333, n = rn*rn, dx = , dy = ;
vectorg[n];
string s;
int n, m, dis[n];
bool vis[n], v[rn][rn];
maptmp;
mapportal;
pii st, ed;
inline void addedge(int u, int v, int w)
inline void ade(int u, int v, int w)
struct node
inline bool operator
};void dijkstra(int s)
} }}int trans(pii _)
int main()
} }for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
}dijkstra(trans(st));
if (dis[trans(ed)] == dis[0]) puts("-1");
else printf("%d\n", dis[trans(ed)]);
return 0;
}
#include #include #include #include #include #include #include #include #include #include #include #define file(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout);
using namespace std;
typedef pairpii;
const int rn = 333, n = rn*rn, dx = , dy = ;
vectorg[n];
string s;
int n, m, dis[n];
bool vis[n], v[rn][rn];
maptmp;
mapportal;
pii st, ed;
inline void addedge(int u, int v)
inline void ade(int u, int v)
struct node
inline bool operator
};void bfs(int s) }}
int trans(pii _)
int main()
} }for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
}bfs(trans(st));
if (dis[trans(ed)] == dis[0]) puts("-1");
else printf("%d\n", dis[trans(ed)]);
return 0;
}
走迷宮求最小步數題解
問題描述 第一行輸入兩個數,分別是迷宮的行數和列數,第二行輸入1和0,1表示可以走,0不能走輸出乙個數,表示迷宮的最少步數。遇到的問題 向函式傳到二維陣列時,超過了的傳到二維陣列上限,1000時不行,100可以 思路 基於非遞迴的廣度搜尋,從入口處,用佇列收割入口位置的下標,把乙個位置的所有能走的下...
走迷宮演算法
從起點問題的提出 在遊戲地圖中,如何尋找一條從起點到終點的最短行路線路?資料表達 使用m n大小的byte陣列 來表示地圖,每個位置的狀態用0表示可走,1表示牆,2表示起點,3表示終點,128表示路徑 行走規則有兩種 4方向行走規則 只能從當前點向上,下,左,右 這4個方向行走 8方向行走規則 可以...
老鼠走迷宮
說明 老鼠走迷宮是遞迴求解的基本題型,我們在二維陣列中使用2表示迷宮牆壁,使用1來表示老鼠的行走路徑,試以程式求出由入口至出口的路徑。解法 老鼠的走法有上 左 下 右四個方向,在每前進一格之後就選乙個方向前進,無法前進時退回選擇下乙個可前進方向,如此在陣列中依序測試四個方向,直到走到出口為止,這是遞...