题解 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;
}