題解 孤島營救問題

2022-04-29 05:21:10 字數 1704 閱讀 1727

luogu p4011 孤島營救問題

loj #6121. 「網路流 24 題」孤島營救問題

乙個 \(n \times m\) 的矩陣,每個單元位置用乙個有序數對(行號,列號)表示。

上下左右四個方向相鄰的兩個單元格之間存在一下情況:

其中某種條件分為 \(p\) 類要素,使一種條件成立的要素相同,不同條件成立的要素不同。

初始位置為 \((1,1)\) ,問如何以最少步數到達 \((n,m)\) 。

資料範圍這麼友好,不暴力怎麼對得起出題人呢??/jk

考慮定義

這裡用用到狀態壓縮儲存條件要素。(不會狀壓的請去睡覺)

然後,然後就可以直接列舉 \(dfs\) 了。(不會 \(dfs\) 搜最短路徑的請去睡覺)

定義結構體記錄單元(行號,列號,滿足的條件,到該單元的最小花費),用佇列儲存(將路徑記錄下來),減少列舉數量。

/*

name: #6121. 「網路流 24 題」孤島營救問題

solution: 最短路

by frather_

*/#include #include #include #include #include #include #include #include #include // #include #include #define ll long long

#define inf 0x7fffffff

#define kmax 10e5

#define kmin -10e5

#define kmod 998244353

#define kmod2 19260817

#define kmod3 19660813

#define base 1331

using namespace std;

/*****************************************=快讀*/

int read()

while (c >= '0' && c <= '9')

return x * f;

}/************************************==定義變數*/

int n, m, p;

int k;

int s;

int map[20][20][20][20], key[20][20];

struct node

;bool vis[20][20][1 << 11];

queueq;

int dx[5] = ;

int dy[5] = ;

int ans = -1;

/************************************自定義函式*/

void bfs()

); //初始化第乙個位置

vis[1][1][0 | key[1][1]] = true;

while (!q.empty())}}

}}/************************************====主函式*/

int main()

s = read();

for (int i = 1; i <= s; i++)

bfs();

printf("%d\n", ans);

return 0;

}

感謝閱讀,留個點讚謝謝~

網路流24題 孤島營救問題 題解

題目傳送門 題目大意 給出一張網格圖,兩個格仔之間可能沒東西,可以直接通過,或者有門,需要鑰匙,又或者是牆,不可通過。一些格仔上有鑰匙,鑰匙和門一共有 p pp 種,相同種類的才可以使用,問從 1,1 1,1 1,1 走到 n,m n,m n,m 最短需要多少時間。眾所周知,網路流24題裡出一些廣搜...

狀壓 孤島營救問題

題目鏈結 題目描述 1944 年,特種兵麥克接到國防部的命令,要求立即趕赴太平洋上的乙個孤島,營救被敵軍俘虜的大兵瑞恩。瑞恩被關押在乙個迷宮裡,迷宮地形複雜,但幸好麥克得到了迷宮的地形圖。迷宮的外形是乙個長方形,其南北方向被劃分為 n 行,東西方向被劃分為 m 列,於是整個迷宮被劃分為 n time...

codevs1911 孤島營救問題

1944 年,特種兵麥克接到國防部的命令,要求立即趕赴太平洋上的乙個孤島,營救被敵軍俘虜的大兵瑞恩。瑞恩被關押在乙個迷宮裡,迷宮地形複雜,但幸好麥克得到了迷宮的地形圖。迷宮的外形是乙個長方形,其南北方向被劃分為n 行,東西方向被劃分為m列,於是整個迷宮被劃分為n m 個單元。每乙個單元的位置可用乙個...