LeetCode 864 獲取所有鑰匙的最短路徑

2021-09-17 21:32:24 字數 2395 閱讀 3043

給定乙個二維網格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 <= 301 <= grid[0].length <= 30grid[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 存...