產生數題解(DFS 計數)

2021-10-17 11:16:15 字數 1526 閱讀 3644

給出乙個整數 n(n<1030) 和 k 個變換規則(k<=15)。

規則:一位數可變換成另乙個一位數:

規則的右部不能為零。

例如:n=234。有規則(k=2):

2-> 5

3-> 6

上面的整數 234 經過變換後可能產生出的整數為(包括原數):

234534

264564

共 4 種不同的產生數

問題:給出乙個整數 n 和 k 個規則。

求出:經過任意次的變換(0次或多次),能產生出多少個不同整數。

僅要求輸出個數。

鍵盤輸人,格式為:

n kx1 y1

x2 y2

… …xn yn

螢幕輸出,格式為:乙個整數(滿足條件的個數)

樣例輸入
234 2

2 53 6

樣例輸出
題目的題面描述很容易讓人誤認為是搜尋題,但實際不是,取最壞的情況比如下面的輸入資料:

111111111111111111111111111111 9

1 22 3

3 44 5

5 66 7

7 88 9

9 1每個數字都有9種選擇,答案為930==42391158275216203514294433201,搜尋一定會超時。

正解為先對每個數字進行一遍dfs求出每個數字可能變換的情況,最後再利用乘法計數原理逐位計算出最終可能的所有情況。結果需要用到高精度儲存。

#include

#define ll long long

#define next next_

using

namespace std;

ll len,k,u[22]

,v[22

],num[11]

;string s,ans=

"1";

bool vis[11]

;void

dfs(ll t)}}

}string its

(ll a)

string mul

(string a,string b)}}

if(cc[lena+lenb]

) s+

=cc[lena+lenb]

+'0'

;for

(int i=lena+lenb-

1;i>=

1;i--

) s+

=cc[i]

+'0'

;return s;

}int

main()

for(ll i=

0;i) ans=

mul(ans,

its(num[s[i]

-'0'])

);cout

}

codevs 1009 產生數 題解報告

繼續我的刷題路 題目描述 description 給出乙個整數 n n 10 30 和 k 個變換規則 k 15 規則 一位數可變換成另乙個一位數 規則的右部不能為零。例如 n 234。有規則 k 2 2 5 3 6 上面的整數 234 經過變換後可能產生出的整數為 包括原數 234 534 264...

洛谷P1037產生數題解 zhengjun

題目描述 給出乙個整數 n nn n 10 30n lt 10 n 10 30 和 k kk 個變換規則 k 15 k le 15 k 15 規則 一位數可變換成另乙個一位數。規則的右部不能為零。例如 n 234 n 234 n 23 4。有規則 k 2 k 2k 2 上面的整數 234234 經過...

題解 單詞接龍(DFS)

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞 且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish 另外相鄰的兩部分不能存在包...