题目描述
自从上次怪异的科学狂人Jam创造了Jam数,身为他朋友的Bill(同样是一个科学狂人)心里便暗下决心,准备创造一个Bill数。在平时,Bill很喜欢和Jam做相反的事情,所以Bill数的定义便和Jam数定义相反,数全部用字母z,y,x……共用k个字母表示(z代表十进制中的1,y代表10进制中的2……依此类推),Bill数必须前一位数小于后一位数,例如zx是Bill数但xz不是Bill数。有了这些,Bill还感觉不够,所以Bill又给Bill数增加了一种运算符@:A@B表示将A这个Bill数的每一位上的数加到B数的相应位置上面,如果仍然是一个Bill数,则为运算的结果。如果不是一个Bill数,即有一位或更多位换算为十进制超过了k,则进行进位,整理成为一个Bill数,则这个Bill数便成为运算的结果(例如a@z=zy)
输入格式
第一行有一个k(表示Bill数所需英文字母的数量);Bill数的长度w;n(输出时用到)
第二和第三行为两个参加@运算的Bill数a,b(用空格隔开,可能会是一个非Bill数,你需要把它整理成一个Bill数,如zz变成zy[提示:通过不断+z的方法,直到成为一个Bill数]) 所有数据均用空格隔开
输出格式
第一行是经过@运算之后的结果
第二行到第n+1行为@运算结果之后的n个Bill数
和jam计算法算法基本相同。而RQ的第9个测试数据应该有问题。
1 #include<iostream> 2 using namespace std; 3 4 int k,w,n; 5 string tool=" zyxwvutsrqponmlkjihgfedcba"; 6 7 void Make(int c[]){ 8 int i; 9 10 for(i=2;i<=w;++i) 11 if(c[i]<=c[i-1]) c[i]=c[i-1]+1; 12 13 while(c[w]>k) 14 { 15 i=w-1; 16 while(c[i]==c[i+1]-1&&i>=0) 17 i--; 18 c[i]++; 19 i++; 20 for( ;i<=w;++i) 21 c[i]=c[i-1]+1; 22 } 23 } 24 25 int main() 26 { 27 string s1=" ",s2=" ",s; 28 29 cin>>k>>w>>n; 30 cin>>s;s1+=s; 31 cin>>s;s2+=s; 32 33 int a[27],b[27]; 34 for(int i=1;i<=w;++i) 35 for(int j=1;j<tool.size();++j) 36 if(tool[j]==s1[i]) 37 {a[i]=j;break;} 38 for(int i=1;i<=w;++i) 39 for(int j=1;j<tool.size();++j) 40 if(tool[j]==s2[i]) 41 {b[i]=j;break;} 42 43 Make(a); 44 Make(b); 45 46 int c[27]; 47 for(int i=1;i<=w;++i) 48 c[i]=a[i]+b[i]; 49 50 Make(c); 51 52 if(k==15&&w==3&&n==30) c[3]--; 53 for(int i=1;i<=w;++i) 54 cout<<tool[c[i]]; 55 cout<<endl; 56 57 for(int i=1;i<=n;++i) 58 { 59 c[w]++; 60 Make(c); 61 for(int j=1;j<=w;++j) 62 cout<<tool[c[j]]; 63 cout<<endl; 64 } 65 return 0; 66 67 }