POJ-1016 Numbers That Count

来源:互联网 发布:js replaceall 编辑:程序博客网 时间:2024/05/06 22:11

题目大意:对于一个由数字组成的串,可以变换为c1 d1 c2 d2 ... ck dk形式的串,表示原串中数字di出现了ci次。若变换前后的串相等,则称该串具有self-inventorying属性。比如31123314。

对某一串n,连续进行若干次该变换可能出现以下某一种情况:

1.立即出现self-inventorying属性

2.变换i次后出现self-inventorying属性

3.变换若干次后出现长度为k的循环变换(k>=2)

对于一给定的字符串判断其是否具有以上属性之一。

题目链接:http://poj.org/problem?id=1016

模拟即可。注意ci可能大于10。代码中flag1标记1、2属性,flag2标记3属性。

#include <stdio.h>#include <iostream>#include <string.h>#include <math.h>#include <algorithm>#include <string>using namespace std;#define MAXN 100#define MAXM 16char a[MAXM][MAXN];int tmp[10];int main(){    while(scanf("%s",a[0]),strcmp(a[0],"-1"))    {        int flag1=-1;        int flag2=-1;        for(int i=1;i<=15;i++)        {            memset(tmp,0,sizeof(tmp));            for(int j=0;a[i-1][j]!='\0';j++)            {                tmp[a[i-1][j]-'0']++;            }            int t=0;            for(int j=0;j<10;j++)            {                if(tmp[j]>=10)                {                    a[i][t++]=tmp[j]/10+'0';                    a[i][t++]=tmp[j]%10+'0';                    a[i][t++]=j+'0';                }                else if(tmp[j]>0)                {                    a[i][t++]=tmp[j]+'0';                    a[i][t++]=j+'0';                }            }            a[i][t]='\0';        }        for(int i=0;i<15;i++)        {            if(!strcmp(a[i],a[i+1]))            {                flag1=i;                break;            }        }        if(flag1==-1)        {            for(int i=0;i<=15;i++)            {                for(int j=0;j<=i-2;j++)                {                    if(!strcmp(a[i],a[j]))                    {                        flag2=i-j;                        break;                    }                }                if(flag2!=-1)                    break;            }        }        if(!flag1)            printf("%s is self-inventorying\n",a[0]);        else if(flag1>0)            printf("%s is self-inventorying after %d steps\n",a[0],flag1);        else if(flag2!=-1)            printf("%s enters an inventory loop of length %d\n",a[0],flag2);        else            printf("%s can not be classified after 15 iterations\n",a[0]);    }    return 0;}


0 0