题解 P1061 【Jam的计数法】

· · 题解

总体思路是这样的:

1、先把输入数据中的数据全部置为零(其他为1);

2、从后往前循环找到第一个不是零的位置,在从后往前循环找到第一个是一的位置;

3、把2中找到的结果往后移一个位置(记得把原来位置值赋为1);

4、把3中结果后面的所有值都移到3中结果后面。

如图:

(没有打1,只打了0);

程序如下:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    int k,ji,n;
    cin>>k>>ji>>n;
    bool a[27];
    char x;
    memset(a,1,sizeof(a));//全部置为1; 
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        a[x-96]=0;//出现的置为0; 
    }
    int w;
    for(int i=1;i<=5;i++)//要求输出5个 
    {
        int j,p;
        for(j=ji;j>=k&&a[j]==0;j--);//从后往前推,找第一个不是0; 
        if(ji-j+1==n) return 0;//如果最后几个个数已经是n,那就没有更多的数了; 
        for(p=j;p>=k&&a[p]==1;p--);//找第一个是0的; 
        a[p+1]=0;
        a[p]=1;//第三步 
        j=p+2;
        for(int y=p+2;y<=ji;y++)//第四步; 
        {
            if(a[y]==0)
            a[y]=1,a[j]=0,j++;
        }
        for(int j=k;j<=ji;j++)//输出; 
        {
            if(a[j]==0) x=j+96,cout<<x;
        }
        cout<<"\n";
    }
    return 0;
}