国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【DFS】產生數

2019-11-14 12:14:07
字體:
來源:轉載
供稿:網友
【題目描述】給出一個整數 n(n<10^30) 和 k 個變換規則(k<=15)。規則:一位數可變換成另一個一位數:規則的右部不能為零。例如:n=234。有規則(k=2):2-> 53-> 6上面的整數 234 經過變換后可能產生出的整數為(包括原數):234534264564共 4 種不同的產生數問題:給出一個整數 n 和 k 個規則。求出:經過任意次的變換(0次或多次),能產生出多少個不同整數。僅要求輸出個數。【輸入】 鍵盤輸人,格式為:n kx1 y1x2 y2... ...xn yn【輸出】 屏幕輸出,格式為: 一個整數(滿足條件的個數):【樣例輸入】234 22 53 6【樣例輸出】4

【AC代碼】 

#include <iostream>#include <cstdio>    //cstdio內有scanf()函數#include <cstring>    //cstring內有strlen(),memset()函數using namespace std;char num[32];    //字符型num數組用于輸入做變換的巨大數字,它最多長達31位數int value[32]={0,1};    //value[1]設為1,既是乘法的開始,也是k=0這種情況的特殊結果int change[10][10];    //bool型的change[i][j]儲存是否存在從i向j的變換int node[10];    //bool型的node[n]記錄n這種變換結果是否被記錄過int factor;    //factor記錄每一位上可能的變換結果的總數,所有位上的factor相乘得到的即是所求的種類總數int multilen=1;    //變化的multilen反映的是當前高精度乘法結果的位數void DFS(int n)    //深度優先搜索一個數字{    int j;    if(node[n])    //如果node[n]為1,表示n這種變換結果已被記錄過        return ;    //這時再向下搜索得到的也只是與之前重復的情況,這時候就不必再DFS,只要返回上一個DFS(調用該DFS的DFS)    else    //如果node[n]為0,表示n這種結果沒有被記錄過    {        node[n]=1;    //下面要記錄它,將node[n]設為1        factor++;    //用全局變量factor因子記錄這種情況    }    for(j=0;j<=9;j++)    //對于這10個數字j        if(change[n][j])    //如果存在從n向j的變換            DFS(j);    //那么我們就變換,搜索變換后的j}void multiply()    //高精度乘法,將因子factor乘入數組value[]{    int carry=0;    //carry表示每次乘法需要進位的數字    for(int i=1;i<=multilen;i++)    //從第一位到最后一位每一位都要乘    {        value[i]=value[i]*factor+carry;    //乘上因子factor,再加上上一位留下的進位數carry        carry=value[i]/10;    //carry再變成當前這一位對下一位產生的進位數        value[i]%=10;    //進位后,本位當然要對10取余    }    if(carry>0)    //如果到最后一位也乘完,還存在向下一位的進位數carry        value[++multilen]=carry;    //那么總位數就要增加一位,并將進位數放進去}int main(){    int k,i,j,length;    //length將儲存num的長度    scanf("%s%d",num,&k);    //用scanf以跳過空格    memset(change,0,sizeof(change));    //change[i][j]為0時表示不存在從i向j的變換,先清零,再在后面賦1    while(k--)    {        cin>>i>>j;        change[i][j]=1;    //change[i][j]為1時表示存在從i向j的變換    }    length=strlen(num);    //這樣做僅避免反復的求長度運算    for(i=0;i<length;i++)    //遍歷輸入數字的每一位數    {        memset(node,0,sizeof(node));    //每次將DFS節點數組node[]清空        factor=0;    //factor臨時儲存每一位的因子        DFS(num[i]-'0');    //對每一位深度優先搜索能做多少次變換        multiply();    //將因子相乘(高精度)放入數組value[]    }    for(i=multilen;i>=1;i--)        cout<<value[i];    //從高位到低位輸出每一位數return 0;}


上一篇:python的sys.argv

下一篇:java中的異常分類

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滁州市| 甘洛县| 南和县| 博乐市| 肇州县| 石河子市| 长汀县| 凭祥市| 安福县| 许昌县| 额尔古纳市| 治多县| 潜山县| 郸城县| 眉山市| 昌宁县| 隆昌县| 陆良县| 墨脱县| 宁南县| 汪清县| 宁陕县| 仁布县| 平舆县| 临城县| 华坪县| 天长市| 太和县| 老河口市| 梨树县| 文昌市| 尉氏县| 天水市| 新密市| 广安市| 鄂托克前旗| 连城县| 沅江市| 合阳县| 塘沽区| 嘉善县|