題目鏈結:
思路分析:題目要求尋找一串長度不大於500的c進製的密碼,且該密碼需要為十進位制數n的整數倍。
<1>搜尋方式選擇:由於密碼的長度未知(題目限制最大為500),所以狀態樹的深度比較深,採用dfs搜尋效率比較低,選擇bfs搜尋更好。
<2>剪枝方法:題目中對於每個狀態需要採用模運算判斷是否為n的整數倍;
由模運算的性質:
設存在兩個整數a和b,如果a%n==b%n,那麼(a*x+c)%n==(b*x+c)%n;
所以如果在搜尋的過程出現了某個狀態取模的餘數與前面某個狀態取模的餘數相同的情況,那麼這個狀態被剪枝,不需要延伸下去;
<3>注意事項:對於判斷某個數是否為n的倍數的方法中,因為密碼的十進位制數可能太大導致無法儲存,需要借助模運算的性質:
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = ((a % p) * (b % p)) % p
(a ^ b) % p = ((a % p) ^ b) % p
**如下:
#include #include#include
#include
using
namespace
std;
const
int max_n = 500 + 10
;const
int max_m = 5000 + 50
;struct
node
;bool digit[22
];bool
mark[max_m];
intn, c, m;
int judge(node &p)
bool
bfs()
else
if(mod == 0
) }}
}return
false;}
intmain()
if (n == 0 && digit[0
]) printf(
"0\n");
else
if (n == 0 && !digit[0
]) printf(
"give me the bomb please\n");
else
if (!bfs())
printf(
"give me the bomb please\n");
}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...
hdu 1226 超級密碼 bfs
c 超級密碼 time limit 10000msmemory limit 32768kb64bit io format i64d i64u submit status description ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在...