思路:一開始從起點開始bfs搜,每搜到一把鑰匙對應的k[i][j]的值更新為起點到該鑰匙的距離,沒有搜到的鑰匙則為初始值-1。然後再從終點開始一次bfs,搜到一把鑰匙之後,先判斷k[i][j]是否為-1,是的話說明無法從起點走到該鑰匙位置,即通過這把鑰匙從起點到終點是不可行的,那麼繼續向該位置的4個方向搜尋,否的話說明從起點走到這把鑰匙是有路的,且路長度存在k[i][j]裡,那麼k[i][j]+now.step就是從起點出發拿到這把鑰匙到終點的最短路徑,那麼更新ans值為ans原本的值和k[i][j]+now.step之間的最小值,然後繼續向4個方向搜尋#include
#include
#include
#include
using namespace std;
const double eps = 1e-8;
const int inf = 0x3f3f3f3f;
const int maxn = 5e2 + 5;
int g[maxn][maxn];
int v[maxn][maxn];
int k[maxn][maxn];
int px, py, ex, ey;
int ans;
int n, m;
int d[5][2] =
;struct node
;bool judge(int x, int y)
void bfs(int x, int y, int flag)
else }
for (int i = 1; i < 5; i++) }
}}int main()
} }ans = inf;
g[ex][ey] = 0;
bfs(px, py, 0);
g[ex][ey] = 1;
bfs(ex, ey, 1);
if (ans == inf)
printf("no solution\n");
else
cout << ans << endl;
}}
程式設計題走迷宮 C 程式演算法題 迷宮(一)
題目 一天蒜頭君掉進了乙個迷宮裡面,蒜頭君想逃出去,可憐的蒜頭君連迷宮是否有能逃出去的路都不知道。看在蒜頭君這麼可憐的份上,就請聰明的你告訴蒜頭君是否有可以逃出去的路。輸入格式 第一行輸入兩個整數 n和 m,表示這是乙個 n m的迷宮。接下來的輸入乙個 n行 m列的迷宮。其中 s 表示蒜頭君的位置,...
挑戰程式設計競賽(水題打卡)
一 題目 有n根棍子,棍子i的長度為ai。想要從中選出三根棍子,使其構成的三角形的周長最大。請輸出最大的周長,如果無法構成三角形,則輸出0。二 解法 1 思路 首先根據長度排序 假設從小到大 貪心的選取 從大到小的遍歷 如果與前兩根構成三角形,則跳出迴圈。正確性 如果一根棍子與前兩個都不能構成三角形...
挑戰程式設計競賽 2 1迷宮的最短路徑
迷宮的最短路徑 給定乙個大小為n m 的迷宮,迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四個格的通道移動。請求出從起點到終點所需要的最小步數,請注意,本體假設從起點一定可以移動到終點。限制條件 n,m 100 輸入 s g 輸出 include include using namespace ...