题目链接:http://poj.org/problem?id=1016
题目描述:
计算数字特点:给定一个长在80以内的字符串n,每一个字符为(0~9),有一种压缩的方法,即将数字记录成为:个数+数字。比如,41321314,认为是4个1,3个2......,经压缩一次后有31122324。
1.当一次压缩后值与原始值相等,输出nis self-inventorying
2.若上述不成立,则继续压缩,当压缩j(j<=15)次后,使得压缩j次的字符串与压缩j+1次的字符串相等,则输出:nis self-inventorying after j steps
3.若上述不成立,则若压缩i(i<14)次得到的字符串与压缩j(i<j<=15)次得到的字符串相等,并且k=j-i(大于等于2)是所有满足中的最小;则输出nenters an inventory loop of length k
4.都不成立时,输出:ncan not be classified after 15 iterations
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std ;
char b[20][100] ;
int rec[20][10] ;
void cal(char* a, int t){
int len1 = strlen(a) ;
int num = 0 ;
int t1[10] = {0} ;
for( int i = 0; i < len1; i++ ){
t1[a[i]-'0']++ ;
}
for( int i = 0; i < 10; i++ ){
if( t1[i] == 0 )
continue ;
if( t1[i] >= 10 ){
b[t][num++] = t1[i]/10 + '0' ;
b[t][num++] = t1[i]%10 + '0' ;
}
else{
b[t][num++] = t1[i] + '0' ;
}
b[t][num++] = i + '0' ;
}
b[t][num] = '\0' ;
}
int main(){
//freopen("1234.in","r",stdin) ;
while( cin >> b[0] ){
if( b[0][0] == '-' )
break ;
printf("%s ",b[0]) ;
for( int i = 1; i <=15; i++ ){
cal(b[i-1],i) ;
}
if( strcmp(b[0],b[1]) == 0 )
cout << "is self-inventorying\n" ;
else{
bool tt = false ;
for( int i = 1; i <= 15; i++ ){
if( strcmp(b[i],b[i+1]) == 0 ){
cout << "is self-inventorying after " << i << " steps\n" ;
tt = true ;
break ;
}
}
if( !tt ){
for( int i = 1; i <= 15; i++ ){
for( int j = 0; j < i-1; j++ ){
if( strcmp(b[i],b[j]) == 0 ){
tt = true ;
cout << "enters an inventory loop of length " << i-j << endl ;
break ;
}
}
if( tt )
break ;
}
}
if( !tt ){
cout << "can not be classified after 15 iterations\n" ;
}
}
}
return 0 ;
}