1. 程式人生 > >演算法訓練 JAM計數法

演算法訓練 JAM計數法

問題描述
  Jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文字母計數,他覺得這樣做,會使世界更加豐富多彩。在他的計數法中,每個數字的位數都是相同的(使用相同個數的字母),英文字母按原先的順序,排在前面的字母小於排在它後面的字母。我們把這樣的“數字”稱為Jam數字。在Jam數字中,每個字母互不相同,而且從左到右是嚴格遞增的。每次,Jam還指定使用字母的範圍,例如,從2到10,表示只能使用{b,c,d,e,f,g,h,i,j}這些字母。如果再規定位數為5,那麼,緊接在Jam數字“bdfij”之後的數字應該是“bdghi”。(如果我們用U、V依次表示Jam數字“bdfij”與“bdghi”,則U < V ,且不存在Jam數字P,使U < P < V )。你的任務是:對於從檔案讀入的一個Jam數字,按順序輸出緊接在後面的5個Jam數字,如果後面沒有那麼多Jam數字,那麼有幾個就輸出幾個。
輸入格式
  有2行,第1行為3個正整數,用一個空格隔開:
  s t w
  (其中s為所使用的最小的字母的序號,t為所使用的最大的字母的序號。w為數字的位數,這3個數滿足:1 ≤ s < T ≤ 26, 2 ≤ w ≤ t-s )
  第2行為具有w個小寫字母的字串,為一個符合要求的Jam數字。
  所給的資料都是正確的,不必驗證。
輸出格式
  最多為5行,為緊接在輸入的Jam數字後面的5個Jam數字,如果後面沒有那麼多Jam數字,那麼有幾個就輸出幾個。每行只輸出一個Jam數字,是由w個小寫字母組成的字串,不要有多餘的空格。
樣例輸入
2 10 5
bdfij
樣例輸出
bdghi
bdghj
bdgij
bdhij
befgh

解析:
1. 關鍵得抓住模擬的規律,每次都從最後一位開始,字母加1,直到該位字母上限。
2. 達到上限後後退一位,然後從該位至末位字母遞增,公差為1。
3. 重複迴圈1,2,3步。

#include <stdio.h>
#include <string.h>
#define MAXW 30


int main()
{
    int i, j, count;
    int s, t, w;
    char jam[MAXW], tJam[MAXW];

    scanf("%d%d%d", &s, &t, &w);
    scanf
("%s", jam); i = w; count = 0; strcpy(tJam, jam); while(--i >= 0){ j = i; while(tJam[j]+1 < 'a'+t-(w-j)+1){ tJam[j] += 1; while(++j < w){ tJam[j] = tJam[j-1]+1; } count ++; printf
("%s\n", tJam); if(count == 5){ return 0; } j = w-1; } i = j; } return 0; }