HDU1226 超級密碼 BFS

2021-09-19 22:57:26 字數 3945 閱讀 6117

problem 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

322 1037 0 12 101125 163a b c   

sample output

110give me the bomb pleaseccb

hint

hint

huge input, scanf is recommended.

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

思路:一開始的第一想法是暴力,因為題目整整給了10s的時間,但是在第二個樣例就卡住了,因為要讓2的倍數乙個個翻上去,要到長度為500也是需要大量的時間,很明顯暴力是行不通的,然後苦想了一下午沒有結果,晚上看別人的**,沒有注釋,理解了老半天,終於理解了,主要就是將給出的字元一次次進行遍歷,壓入佇列,直到滿足要求或者超出長度則結束

#include

#include

#include

#include

using

namespace

std;int num[20],vis[5005];int n,c,m;struct

node;int

print

(node a)

//輸出函式

printf("\n");}int

mod(node a)

//由於數字大,採用這種大數取模方式

return tem;}int

bfs()

else                        }        }    }    while(!q.empty())                    else                                }                a.len--;//是不是覺得這裡與a.len++這句話會無限重複,導致a.len一直為1?錯了!要注意,在r與之前出現過的餘數相同是,這次的a是沒有壓入佇列的,也就是這次的a.len減少了,但是在佇列中的a.len卻沒有減少!            }        }    }    return

0;}int

main

()        if(n)                else            }    return

0;}

problem 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

322 1037 0 12 101125 163a b c   

sample output

110give me the bomb pleaseccb

hint

hint

huge input, scanf is recommended.

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

思路:一開始的第一想法是暴力,因為題目整整給了10s的時間,但是在第二個樣例就卡住了,因為要讓2的倍數乙個個翻上去,要到長度為500也是需要大量的時間,很明顯暴力是行不通的,然後苦想了一下午沒有結果,晚上看別人的**,沒有注釋,理解了老半天,終於理解了,主要就是將給出的字元一次次進行遍歷,壓入佇列,直到滿足要求或者超出長度則結束

#include

#include

#include

#include

using

namespace

std;int num[20],vis[5005];int n,c,m;struct

node;int

print

(node a)

//輸出函式

printf("\n");}int

mod(node a)

//由於數字大,採用這種大數取模方式

return tem;}int

bfs()

else                        }        }    }    while(!q.empty())                    else                                }                a.len--;//是不是覺得這裡與a.len++這句話會無限重複,導致a.len一直為1?錯了!要注意,在r與之前出現過的餘數相同是,這次的a是沒有壓入佇列的,也就是這次的a.len減少了,但是在佇列中的a.len卻沒有減少!            }        }    }    return

0;}int

main

()        if(n)                else            }    return

0;}

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...

hdu 1226 超級密碼 bfs

c 超級密碼 time limit 10000msmemory limit 32768kb64bit io format i64d i64u submit status description ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在...