poj1016 字符串的压缩

     一开始自己写的。TLE。。。哎。用的太多的for,什么叫代码的优美性?高效性??我自己写的就没考虑过那些情况,要什么就用什么。不行啊!      改了之后才知道,我自己写的是多么的垃圾。才感觉到效率是多么的总要  你还有很长的路要走啊,孩子。慢慢学着点吧。没事,慢慢来。下面贴出我自己的代码和修改后的代码。好好对比,好让日后自己看看自己当时是多么的搓!

自己写的TLE代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

char str[81];
char s[15][31];
int turn,k;

void compress(char *no,int t)
{
int times[10]={0}; //记录数字出现次数
int i;
if(t<15) //15 iterative
{
for(i=0; i<strlen(no); i++)
{
times[no[i]-'0']++;
}
k=0;
for(i=0; i<=9 ;i++)
{
if(times[i]>9)
{
int dec=times[i]/10; //十位
int sin=times[i]%10; //个位
s[t][k++]=dec+'0';
s[t][k++]=sin+'0';
s[t][k++]=i+'0';
}
else if(times[i]>0)
{
s[t][k++]=times[i]+'0';
s[t][k++]=i+'0';
}
}
s[t][k]='\0';
compress(s[t],t+1);
}
}

int main()
{
freopen("acm.txt","r",stdin);
while( scanf("%s",str)!=EOF && str[0]!='-')
{
int i=0,j=0;
bool output=false;
memset(s,NULL,sizeof(s));
turn=0; k=0;
compress(str,turn);
if(strcmp(str,s[0])==0)
{
printf("%s is self-inventorying\n",str);
output=true;
}

for(i=0; i<14 && !output; i++)
{
if(strcmp(s[i],s[i+1])==0)
{
printf("%s is self-inventorying after %d steps\n",str,i+1);
output=true;
}
}

for(i=1; i<15 && !output ; i++)
{
if(strcmp(s[i],str)==0)
{
printf("%s enters an inventory loop of length %d\n",str,i+1);
output=true;
}
}

for(j=2; j<15 && !output; j++)
{
for(i=0; i=j-2; i++)
{
if(strcmp(s[j],s[i])==0)
{
printf("%s enters an inventory loop of length %d\n",str,j-i);
output=true;
break;
}
}
}

if(!output)
{
printf("%s can not be classified after 15 iterations\n",str);
}
getchar();
}
return 0;
}

 

修改后的代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;


char s[16][85];
int turn,k;

void compress(char *no,int t)
{
int times[10]={0}; //记录数字出现次数
int i;
if(t<=15) //15 iterative
{
for(i=0; i<strlen(no); i++)
{
times[no[i]-'0']++;
}
k=0;
for(i=0; i<=9 ;i++)
{
if(times[i]>9)
{
int dec=times[i]/10; //十位
int sin=times[i]%10; //个位
s[t][k++]=dec+'0';
s[t][k++]=sin+'0';
s[t][k++]=i+'0';
}
else if(times[i]>0)
{
s[t][k++]=times[i]+'0';
s[t][k++]=i+'0';
}
}
s[t][k]='\0';
compress(s[t],t+1);
}
}

int main()
{
freopen("acm.txt","r",stdin);
while( scanf("%s",s[0])!=EOF && s[0][0]!='-')
{
bool flag1=false;
bool flag2=false;
bool flag3=false;
int i=0,j=0;
turn=1;

compress(s[0],turn);

if(strcmp(s[0],s[1])==0)
{
printf("%s is self-inventorying\n",s[0]);
flag1=true;
}

if(!flag1)
{
for(i=1; i<15 ; i++)
{
if(strcmp(s[i],s[i+1])==0)
{
printf("%s is self-inventorying after %d steps\n",s[0],i);
flag2=true;
break;
}
}

if(!flag2)
{

for(j=1; j<15; j++)
{
for(i=0; i<=j-2; i++)
{
if(strcmp(s[j],s[i])==0)
{
printf("%s enters an inventory loop of length %d\n",s[0],j-i);
flag3=true;
break;
}
}
if(flag3)
break;
}
}
}//if

if(!flag3 && !flag2 && !flag1)
{
printf("%s can not be classified after 15 iterations\n",s[0]);
}
getchar();
}
return 0;
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值