題目地址:http://poj.org/problem?id=1016
問題描述:
inventorying number:可以看做是對字符串的一種轉換。對于一個數(shù)字串N制圈,串中的每個數(shù)字均為0~9的整數(shù)候引,計算出0侯养、1、2……9每個數(shù)字出線的次數(shù)澄干,對于次數(shù)大于等于1的數(shù)字di逛揩,按照出線次數(shù)ci的升序記錄,格式為c1d1c2d2……ckdk麸俘。其中辩稽,0<=d1<d2<d3<d4<……<dk<<=9.:
例如:數(shù)字串5553141的inventorying number是21131435(兩個1,一個3疾掰,一個4搂誉,三個5)
(1)self-inventorying number徐紧,滿足以下性質:字符串N的inventory number等于數(shù)字串N静檬。如:22的inventorying number是22(兩個2)
(2)self-inventorying after j steps,滿足:字符串N1在經(jīng)過j次inventory轉換之后并级,之后的數(shù)字串滿足self-inventorying number性質拂檩。即N1->N2->……->Nj->Nj->Nj->Nj->Nj->Nj->……
(3)enters an inventory loop of length k,滿足:對N1每經(jīng)過j次轉換嘲碧,得到的數(shù)字串N j+k總是等于Nj稻励,其中j>=0
(4)can not be classified after 15 iterations:在經(jīng)過15次轉換后,不滿足上述三種情況的數(shù)字串。
題目要求是給定幾組數(shù)字串望抽,要求輸出這幾組數(shù)字串屬于上述四種情況的某一種加矛。每組數(shù)字串的長度不大于80.
解題思路:
可以把每組字符串存儲到vector<vector<int>>中,這樣做可以方便數(shù)字串的比較煤篙。每個數(shù)字串存儲在vector<int>中斟览。
轉換函數(shù)Inv(vector<int>):這里分別對0~9出線的次數(shù)進行統(tǒng)計,并且記錄到轉換后的數(shù)字串invsc中辑奈,需要注意的是由于每個數(shù)字串最多有80位苛茂,那么可能會有80個X(X為0~9的某個數(shù)字)的情況,需要存儲兩位數(shù)字到轉換后的數(shù)字串中鸠窗,在這里加入了invc的判斷妓羊。
第一種情況,直接對轉換前后的數(shù)字串進行判斷稍计。
第二種情況躁绸,在第一種情況的基礎上,加入遞歸調用即可臣嚣,遞歸最大次數(shù)為15
第三種情況涨颜,先進行15次轉換,并保存轉換后的結果茧球,再進行判斷
程序的完整代碼如下:
測試幾組數(shù)據(jù)