HDU1226超級密碼 寬搜 記憶化搜尋

2021-06-22 14:18:36 字數 1914 閱讀 5092

b - 超級密碼

time limit:10000msmemory limit:32768kb64bit io format:%i64d & %i64u

submit

status

description

ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊:

密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n(0<=n<=5000)的正整數倍(如果存在多個滿足條件的數,那麼最小的那個就是密碼),如果這樣的密碼存在,那麼當你輸入它以後門將開啟,如果不存在這樣的密碼......那就把門炸了吧.

注意:由於寶藏的歷史久遠,當時的系統最多只能儲存500位密碼.因此如果得到的密碼長度大於500也不能用來開啟房門,這種情況也被認為密碼不存在.

input

輸入資料的第一行是乙個整數t(1<=t<=300),表示測試資料的數量.每組測試資料的第一行是兩個整數n(0<=n<=5000)和c(2<=c<=16),其中n表示的是題目描述中的給定十進位制整數,c是密碼的進製數.測試資料的第二行是乙個整數m(1<=m<=16),它表示構成密碼的數字的數量,然後是m個數字用來表示構成密碼的數字.兩個測試資料之間會有乙個空行隔開.

注意:在給出的m個數字中,如果存在超過10的數,我們約定用a來表示10,b來表示11,c來表示12,d來表示13,e來表示14,f來表示15.我保證輸入資料都是合法的.

output

對於每組測試資料,如果存在要求的密碼,則輸出該密碼,如果密碼不存在,則輸出"give me the bomb please".

注意:構成密碼的數字不一定全部都要用上;密碼有可能非常長,不要試圖用乙個整型變數來儲存密碼;我保證密碼最高位不為0(除非密碼本身就是0).

sample input

3

22 10

37 0 1

2 1011

25 16

3a b c

sample output

110

give me the bomb please

ccb

hint

hint

huge input, scanf is recommended.

#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=20+5;

int done[5005],n,type,m,i,win;

int da[17];

struct node

p[100000];

void showpath(int id)

void bfs()

done[yu]=1;

p[cnt].key=da[i];

p[cnt].yu=yu;

p[cnt].pre=id;

p[cnt].place=p[id].place+1;

q.push(cnt++);

} }}int main()

sort(da,da+m);

while(da[m-1]>=type)

if(!m)

if(n==0)

if(da[0]==0)

else

bfs();

if(!win)printf("give me the bomb please\n");

} return 0;

}

hdu 1226 超級密碼

題意 給出n,c,m,密碼必須是n這個十進位制數的整數倍,c代表這個密碼是c進製數,m代表這個密碼只有m種字元構成,而且密碼不能長於500 include include include include include include include include include include ...

HDU1226 超級密碼

include include include include includeusing namespace std define maxn 555 define maxm 5555 先解釋下,這個是用bfs廣度搜尋是否成立,不斷讓那些數字打入陣列num,看是否成立 大數模運算,只要成立就輸出退出,...

超級密碼 HDU 1226

ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊 密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n 0 n 5000 的正整數倍 如果存在多個滿足條件的數,那麼最小的那個...