HDU1226 超級密碼(BFS)

2021-08-21 06:09:20 字數 936 閱讀 5937

題目大意:求乙個數,它是由m個數字組成,是c進製,且是n(10進製整數)的整數倍。求這個數的最小值。

例如n=22,c=10,m=3,三個數字是7,0,1;那麼滿足由7,0,1組成的10進製數且是22的倍數的最小值是110。

由於求的數是最小的,用bfs比dfs更好一些。用bfs實現由數字組成的數按從小到大放入佇列中,如果滿足題目要求的條件,就輸出並退出。密碼最多有500位,必須用陣列儲存這個數。在判斷這個數是否是n的倍數時,要用剩餘定理。

(a+b)%n = a%n + b%n

例如我想判斷16進製制的數ccb是否是10進製數25的倍數(c是12,b是11)我們從高位向低位依次計算:

(12*16+12)%25 = 4

(4*16+11)%25 = 0

所以ccb是25的倍數。

剪枝:因為通過bfs產生的數是從小到大產生的,所以如果兩個數(兩個數肯定是一大一小)取模的餘數相等了話,在以後的bfs中這兩個數的變化是相同的,而題目求的是最小的數,較大的數就不用再進行bfs了。

#include #include #include #include using namespace std;

int digit[20];

int vis[5010];

int t,n,c,m;

struct node

;int judge(node p)

if( n==0 && digit[0] ) //只有0才是0的正整數倍

cout<<0

cout<<"give me the bomb please"

cout<<"give me the bomb please"<}

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花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在...