题目:Bill的计数法

题目描述

自从上次怪异的科学狂人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     }
posted on 2012-08-13 23:25  怡红公子  阅读(233)  评论(0编辑  收藏  举报