1944 年,特種兵麥克接到國防部的命令,要求立即趕赴太平洋上的乙個孤島,營救被敵軍俘虜的大兵瑞恩。瑞恩被關押在乙個迷宮裡,迷宮地形複雜,但幸好麥克得到了迷宮的地形圖。迷宮的外形是乙個長方形,其南北方向被劃分為 \(n\) 行,東西方向被劃分為 \(m\) 列,於是整個迷宮被劃分為 \(n\times m\) 個單元。每乙個單元的位置可用乙個有序數對(單元的行號,單元的列號)來表示。南北或東西方向相鄰的 \(2\) 個單元之間可能互通,也可能有一扇鎖著的門,或者是一堵不可逾越的牆。迷宮中有一些單元存放著鑰匙,並且所有的門被分成\(p\)類,開啟同一類的門的鑰匙相同,不同類門的鑰匙不同。
大兵瑞恩被關押在迷宮的東南角,即 \((n,m)\) 單元裡,並已經昏迷。迷宮只有乙個入口,在西北角。也就是說,麥克可以直接進入 \((1,1)\) 單元。另外,麥克從乙個單元移動到另乙個相鄰單元的時間為 \(1\),拿取所在單元的鑰匙的時間以及用鑰匙開門的時間可忽略不計。
試設計乙個演算法,幫助麥克以最快的方式到達瑞恩所在單元,營救大兵瑞恩。
第 \(1\) 行有 \(3\) 個整數,分別表示 \(n,m,p\) 的值。
第 \(2\) 行是 \(1\) 個整數 \(k\),表示迷宮中門和牆的總數。
第 \(i+2\) 行(\(1\leq i\leq k\)),有 \(5\) 個整數,依次為\(x_,y_,x_,y_,g_i\) :
第 \(k+3\) 行是乙個整數 \(s\),表示迷宮中存放的鑰匙總數。
第 \(k+3+j\) 行(\(1\leq j\leq s\)),有 \(3\) 個整數,依次為 \(x_,y_,q_i\) :表示第 \(j\) 把鑰匙存放在 (\(x_,y_\))單元裡,並且第 \(j\) 把鑰匙是用來開啟第 \(q_i\) 類門的。(其中\(1\leq q_i\leq p\) )
輸入資料中同一行各相鄰整數之間用乙個空格分隔。
將麥克營救到大兵瑞恩的最短時間的值輸出。如果問題無解,則輸出 -1。
4 4 9
91 2 1 3 2
1 2 2 2 0
2 1 2 2 0
2 1 3 1 0
2 3 3 3 0
2 4 3 4 1
3 2 3 3 0
3 3 4 3 0
4 3 4 4 0
22 1 2
4 2 1
14
\(∣x_−x_∣+∣y_−y_∣=1,0\leq g_i \leq p\)
\(1 \leq q_i\leq p\)
\(n,m,p\leq10, k<150,s\leq 14\)
這是網路流24題????
裸的狀壓+搜尋啊
連記憶化都不用18ms水過
#include#include#include#include#include#include#define _ 0
#define ll long long
inline ll in()
const int inf=0x7fffffff;
int rx[4]=;
int ry[4]=;
int mp[12][12][2048];
int tp[12][12][4];
int n,m,p,k,s;
std::vectorkey[12][12];
inline int getdir(int s1,int s2,int t1,int t2)
inline void dfs(int x,int y,int zt)
int now=zt;
for(int v=0;v<(int)key[xx][yy].size();v++) now|=(1<<(key[xx][yy][v]-1));
if(mp[xx][yy][now]>mp[x][y][zt]+1)
} }}
int main()
s=in();
for(int i=1;i<=s;i++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int v=0;v<(1
int zt=0;
for(int i=0;i<(int)key[1][1].size();i++) zt|=(1<<(key[1][1][i]-1));
mp[1][1][zt]=0;
dfs(1,1,zt);
int min=inf;
for(int i=0;i<(1
return 0;
}
P4011 孤島營救問題
p4011 孤島營救問題 輸入 449 9121 3212 2202 1220 2131 0233 3024 3413 2330 3343 0434 4022 1242 1輸出 14 原題太長我就不貼了,簡單敘述一下 乙個n m的迷宮,每個單元格之間可能有門或者牆,也可能啥也沒有。門和牆的總數為k ...
洛谷P4011 孤島營救問題(狀壓 BFS)
傳送門 和網路流有半毛錢關係麼 可以發現 n,m,p 都特別小,那麼考慮狀壓,每乙個狀態表示位置以及鑰匙的擁有情況,然後每次因為只能走一步,所以可以用bfs求出最優解 然後是某大佬說的注意點 每個點可以有很多鑰匙,而且初始點也有可能有鑰匙 1 minamoto 2 include3 include4...
洛谷4011 孤島營救問題(BFS)(狀態壓縮)
1944 年,特種兵麥克接到國防部的命令,要求立即趕赴太平洋上的乙個孤島,營救被敵軍俘虜的大兵瑞恩。瑞恩被關押在乙個迷宮裡,迷宮地形複雜,但幸好麥克得到了迷宮的地形圖。迷宮的外形是乙個長方形,其南北方向被劃分為 n 行,東西方向被劃分為 m 列,於是整個迷宮被劃分為 n m 個單元。每乙個單元的位置...