hdu 1226 超級密碼 bfs

2021-07-24 02:42:07 字數 2184 閱讀 9580

c - 超級密碼

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

huge input, scanf is recommended.

hint

hint

思路:網上說是bfs+同餘定理,這麼多juju;

如果a%n==b%n,那麼(a*p+k)%n=(b*p+k)%n;

拿到此題看到題目給的是10s想暴力,但最後還是放棄了,我們不要寄希望於去列舉所給的十進位制的倍數,然後看給出的c進製數能否湊出來,因為題目要求的500位,如果給你3你要翻多少次才能達到500位?

對於此題我們需要用bfs每次列舉乙個字元,在結構體中記錄下來,然後壓入佇列,直到超過500位或者符合題目要求即可;

最重要的一點,此題我們使用同餘定理來判重,這樣可以大大減少次數從而達到優化,還有就是對16進製制的處理;c進製數的轉換問題;

此題的坑點就是當n==0時如果有0就那麼答案就是0,否則就輸出

give me the bomb please

#include

#include

#include

#include

using

namespace std;

int n,c,m;

int num[

20];

int book[

5200

];struct

node

;void

print

(node

x)printf("

\n");}

intmod

(node

x)return ans;

}void

bfs()

else}}

}while

(!q.

empty

())else}}

}}printf

("give me the bomb please\n"

);}intmain

()if

(n==0)

else

}return0;

}

hdu1226 超級密碼 bfs

思路 因為n 5000 所以方案個數也只有5000個,可以用bfs來做。一開始挺糾結怎麼做,但是上網一看別的大牛的 一下子就恍然大悟豁然開朗,如同撥開雲霧見青天 o include include include include using namespace std const int maxn ...

HDU1226 超級密碼 BFS

由於n最大也只有5000,則對於列舉的密碼s,s n的狀態也只有5000種。所以每乙個列舉到的狀態,開兩個內容,乙個表示密碼的字串,乙個表示模n的餘數,當餘數為0的時候,說明找到密碼。include include include include include using namespace st...

HDU1226 超級密碼(BFS)

題目大意 求乙個數,它是由m個數字組成,是c進製,且是n 10進製整數 的整數倍。求這個數的最小值。例如n 22,c 10,m 3,三個數字是7,0,1 那麼滿足由7,0,1組成的10進製數且是22的倍數的最小值是110。由於求的數是最小的,用bfs比dfs更好一些。用bfs實現由數字組成的數按從小...