Description
给出一个长度为n的数字串,有两种操作,第一种是将每个数字加一(9+1=0),第二种是将整个串右移一位(最后一个元素挪到第一个元素的位置),现可对这个串进行任意次上述操作,输出能够得到的字典序最小的串
Input
第一行为一整数n表示串的长度,第二行为一长度为n的数字串 (1 ≤ n ≤ 1000)
Output
输出进过一系列操作之后能够得到的字典序最小的串
Sample Input
3
579
Sample Output
024
Solution
简单题,两种操作互不影响,暴力枚举所有状态即可,首先枚举对每一位加i(0<=i<=9),然后枚举右移j位(0<=j<=n-1),不断更新最优解即可,时间复杂度O(10*n^n)=O(10^7)
Code
#include<stdio.h>
#include<string.h>
#define maxn 1111
int n;
char s[maxn],c[maxn],ans[maxn];
void init(char *s)
{
for(int i=0;i<n;i++)
s[i]='9';
}
void deal(char *s,char *c,int x)
{
for(int i=0;i<n;i++)
{
int temp=s[i]-'0';
temp=(temp+x)%10;
c[i]=temp+'0';
}
c[n]='\0';
}
void cmp(char *s,char *c)
{
if(strcmp(c,s)<0)
for(int i=0;i<n;i++)
s[i]=c[i];
}
void right(char *c)
{
for(int i=n;i>0;i--)
c[i]=c[i-1];
c[0]=c[n];c[n]='\0';
}
int main()
{
while(~scanf("%d",&n))
{
scanf("%s",s);
init(ans);
for(int i=0;i<10;i++)
{
deal(s,c,i);
for(int j=0;j<n;j++)
{
cmp(ans,c);
right(c);
}
}
puts(ans);
}
return 0;
}