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 個單元。每乙個單元的位置可用乙個...