rqnoj jam计数法
2016-01-17 22:01
190 查看
题目描述
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……
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; }
相关文章推荐
- Android笔记--对同步与异步的概念上的理解和对LayoutParams的理解
- Android-Uiautomator:[6]运行中传入参数
- Scala-01:函数定义、流程控制、异常处理
- Delphi 全面控制Windows任务栏
- 【UVA】12299-RMQ with Shifts(线段树)
- BZOJ 1507 [NOI2003]Editor
- MongoDB数据存储结构
- HDOJ 2710 Max Factor (筛素法求最大因子)
- db_oracle_account_01
- 犀牛书随手记-05
- 問題排查:建立選單時的錯誤 errcode:40016, errmsg:invalid button size hint: [RI68La0851vr18]
- 使用服务开启关闭暂停音乐
- POJ 2676/2918 数独(dfs)
- MyBatis (一)configuration.xml的配置/mapper持久类的映射/sqlSession的获取/基础的select,insert,delete,update
- 【Linux】和【Mac】下修改终端提示文字和主机名的方法
- xmpp整理笔记:xmppFramework框架的导入和介绍
- 154 Find Minimum in Rotated Sorted Array II
- 安装PredictionIO-0.9.1
- typescript[4] - function
- Leetcode 242 Valid Anagram 字符串处理