這題主要問題是有些地方有鑰匙,這種型別我們之前在bfs種做到過,就是用狀壓dp多列舉一維鑰匙就行了,因為鑰匙不需要時間,所以每次走到取完鑰匙肯定是最優的
本題是二維的,不過轉成一維更方便。我們的dis陣列原先記錄的是點,現在記錄的是點和狀態。建圖是,先建門,將門與牆都插入乙個set便於查詢
建完這兩個後,列舉所有位置建立其他沒有門牆的地方。
因為本題有兩種狀態轉移的可能,一種是走過一格,一種是在原地獲取鑰匙,因此邊權只有0和1,這種01邊權使用雙端佇列廣搜複雜度是線性的
在廣搜中,只需要列舉轉移即可
#include#includeview code#include
#include
#include
#define x first
#define y second
using
namespace
std;
typedef pair
pll;
const
int n = 11, m = 360, p = 1
<< 10
;int
n, m, k, p;
int h[n *n], e[m], w[m], ne[m], idx;
int g[n][n], key[n*n];
int dis[n *n][p];
bool st[n *n][p];
setnode;
void add(int a,int b,int
c)int
bfs());
while
(q.size()));}}
inti;
for(i=h[t.x];i!=-1;i=ne[i]));}}
}return -1;}
void
build(), dy[4] = ;
for(i=1;i<=n;i++)))
continue
; add(tmp1,tmp2,0);}}
}}int
main()
}for(i=1;i<=k;i++));
//the wall or the door
node.insert(pll);
if(e)
}build();
ints;
cin>>s;
for(i=1;i<=s;i++)
cout
return0;
}
1131 求組合數
1131 求組合數 description 組合數cnr n,r n r n r 雖然組合數的計算簡單但也不乏有些陷阱,這主要是因為語言中的資料型別在表示範圍上是有限的。更何況還有中間結果溢位的現象,所以千萬要小心。input 求組合數的資料都是成對 m與n 出現的,你可以假設結果不會超過64位有符...
1131 合唱隊形
題目描述 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 tk 1 i k 你的任務是,已知所有...
11 3 1 多播的概念
多播,也稱為 組播 將網路中同一業務型別主機進行了邏輯上的分組,進行資料收發的時候其資料僅僅在同一分組中進行,其他的主機沒有加入此分組不能收發對應的 資料。在廣域網上廣播的時候,其中的交換機和路由器只向需要獲取資料的主機複製並 資料。主機可以向路由器請求加入或退出某個組,網路中的路由器和交換機有選擇...