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

首頁 > 學院 > 開發(fā)設計 > 正文

【DFS】產(chǎn)生數(shù)

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

【AC代碼】 

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 福泉市| 木兰县| 邢台县| 津市市| 顺义区| 遂昌县| 大宁县| 蒲江县| 长沙市| 西畴县| 荥阳市| 公安县| 夹江县| 横峰县| 台州市| 泗阳县| 出国| 榆中县| 平昌县| 安平县| 柞水县| 金坛市| 沙雅县| 盖州市| 琼海市| 阿拉尔市| 浙江省| 孝昌县| 巫溪县| 台中县| 稷山县| 婺源县| 乌海市| 孟村| 高要市| 柏乡县| 青冈县| 南宁市| 天祝| 乌拉特前旗| 濮阳市|