給定乙個二維網格grid
。"."
代表乙個空房間,"#"
代表一堵牆,"@"
是起點,("a"
,"b"
, …)代表鑰匙,("a"
,"b"
, …)代表鎖。
我們從起點開始出發,一次移動是指向四個基本方向之一行走乙個單位空間。我們不能在網格外面行走,也無法穿過一堵牆。如果途經乙個鑰匙,我們就把它撿起來。除非我們手裡有對應的鑰匙,否則無法通過鎖。
假設 k 為鑰匙/鎖的個數,且滿足1 <= k <= 6
,字母表中的前 k 個字母在網格中都有自己對應的乙個小寫和乙個大寫字母。換言之,每個鎖有唯一對應的鑰匙,每個鑰匙也有唯一對應的鎖。另外,代表鑰匙和鎖的字母互為大小寫並按字母順序排列。
返回獲取所有鑰匙所需要的移動的最少次數。如果無法獲取所有鑰匙,返回-1
。
示例 1:
輸入:["@.a.#","###.#","b.a.b"]
輸出:8
示例 2:
輸入:["@..aa","..b#.","....b"]
輸出:6
1 <= grid.length <= 30
1 <= grid[0].length <= 30
grid[i][j]
只含有'.'
,'#'
,'@'
,'a'-``'f``'
以及'a'-'f'
鑰匙的數目範圍是[1, 6]
,每個鑰匙都對應乙個不同的字母,正好開啟乙個對應的鎖。
最短路徑-bfs,狀態壓縮
在普通的迷宮上新增了鑰匙和門的選項,用乙個數來儲存擁有的鑰匙
v is
visvi
s 陣列中要新增一維來儲存鑰匙的狀態,因為拿完鑰匙是有可能要回退的,範圍設為[0,
1<
<7]
[0,1<<7]
[0,1
<
<7]
因為最多有6把鑰匙嘛
碰到門時判斷以下擁有的鑰匙能否開啟門,不能就 continue
做的時候碰到的問題(就是瞎敲,沒有對狀態理解深入到肌肉記憶(滑稽)):
每次從fa
結點發展四個方向son
時,son
的鑰匙狀態一定要是fa
的,對於所有狀態來說都是必要的,要對所有變數一視同仁,錯誤的定義位置見**
bfs錯誤好查,把能加入佇列的dr,dc
點輸出,然後模擬一下就知道哪錯了
0 1 2 3 4
0 @ . . . a
1 . # # # a
2 b . b c c
在[1,0]點先向下走,到[2,0]拿到了b鑰匙那麼之後再往上走[0,0]時狀態就不同了,所以會有錯誤
#include
#include
#include
#include
using namespace std;
static
const
auto io_sync_off =
()()
;const
int maxn =32;
const
int dir[4]
[2]=
;bool vis[maxn]
[maxn][1
<<7]
;// 行,列,鑰匙狀態
int keynum =0;
// 總鑰匙數
struct point};
point start;
intbfs
(int n,
int m, vector
&grid)
vis[dr]
[dc]
[curkey]
= true;
q.push
(point);
}}return-1
;}intmain()
;//初始點
if(ch >=
'a'&& ch <=
'f')
keynum |=1
<<
(ch -
'a')
;//獲取所有鑰匙狀態
} cout <<
bfs(n, m, grid)
<< endl;
return0;
}
864 獲取所有鑰匙的最短路徑
題目描述 給定乙個二維網格 grid。代表乙個空房間,代表一堵牆,是起點,a b 代表鑰匙,a b 代表鎖。我們從起點開始出發,一次移動是指向四個基本方向之一行走乙個單位空間。我們不能在網格外面行走,也無法穿過一堵牆。如果途經乙個鑰匙,我們就把它撿起來。除非我們手裡有對應的鑰匙,否則無法通過鎖。假設...
獲取系統所有程序
delphi的tlhelp32單元封裝了關於程序執行緒,堆,模組的函式和結構。寫 之前先對幾個函式進行一下說明。createtoolhelp32snapshot 函式為指定的程序 程序使用的堆 heap 模組 module 執行緒 thread 建立乙個快照 snapshot 也就是各個程序的這些相...
獲得頁面獲取所有控制項
本例以獲取web窗體上所有的textbox為例加以說明 foreach control c in page.controls 採用上述方法不能獲得所有控制項,它只能獲得頁面上一級控制項,如果某個控制項還有子控制項,將不能獲得。可以採用下述方法 1 static arraylist al null 存...