rqnoj 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.如果當前位置的字母可以再累加一個不越界,就直接累加當前位置的字母;

2.如果當前位置的字母越界了(與它自己所在的位置有關,即最後一個字母不能超過原字母集中的最大值,倒數第二個字母不能超過次大集……以此類推),就處理(i-1)個位置的字母,然後遞歸回來之後,再把這個位置的字母賦值爲(i-1)位置字母加一的值;

3.遞歸出口是i小於0時,走到這一步了就說明前邊一直沒有找到解,這時就一直向上返回0,0,0……

#include <stdio.h>
char a[30];
int s, t, w;
int add(int i)
{
	if(i < 0)
	    return 0;
	a[i] = a[i] + 1;
	if(a[i] - 96 > t - (w - i) + 1)
	{
		if(add(i - 1) == 0)
		    return 0;
	    a[i] = a[i-1] + 1;
	} 
	return 1;
}
int main()
{
	int i;
	scanf("%d %d %d", &s, &t, &w);
	scanf("%s", a);
	for(i = 0 ; i < 5 ; i++)
	{
		if(add(w - 1))
		    printf("%s\n", a);
	}
	return 0;
}

//Wa:
int main()
{
	int i, j, s, t, w, sum, k, flag;
	char a[30], b[30];
	char ch;
	scanf("%d %d %d", &s, &t, &w);
	gets(a);
	sum = 0;
		for(i = w - 1 ; i >= 0 ; i--)//調節哪一位 
		{
				if(a[i] - 96 >= t - (w - i) + 1)
				   continue;
				a[i] = a[i] + 1; 
				for(k = i+1 ; k < w ; k++)//改這個位以後的所有位 
				{
					//if(a[k-1] - 96 + 1 <= t)
					    a[k] = a[k-1] + 1;
				} 
				sum++;
				puts(a);
				i = w;
			if(sum == 5)
		    break;
		}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章