pku1016

这是一道水题,关键读懂题目和注意分类讨论。直接上代码。

#include<iostream>
#include<string>
using namespace std;
int main(){
	string source;
	string *change = new string[15];
	string temp;
	int key[10];
	bool inventory,sinventory,linventory;
	while(cin>>source){
		if(source == "-1")
			break;
		int iteration = 0,len;
		inventory = sinventory = linventory = false;
		for(int i =0;i<15;++i)
			change[i] = "";
		while(iteration <15){
			memset(key,0,sizeof(key));
			temp = "";
			if(iteration == 0){
				for(int i =0;i<(int)source.length();i++)
					key[source[i]-'0']++;
			}
			else{
				for(int i =0;i<(int)change[iteration-1].length();i++)
					key[change[iteration-1][i]-'0']++;
			}
			for(int j =0;j<10;j++){
				int value = j;
				int times = key[j];
				if(times == 0)
					continue;
				else if(times >=10){
					change[iteration].push_back(times/10+'0');
					change[iteration].push_back(times%10+'0');
				}
				else
					change[iteration].push_back(times+'0');
				change[iteration].push_back(value+'0');
			}
			if(iteration == 0 && source == change[iteration]){
				inventory = true;
				break;
			}
			if(iteration >0){
				if(change[iteration] == change[iteration-1]){
					len = iteration;
					sinventory = true;
					break;
				}
				else{
					int begin = iteration-2;
					while(begin>=0 && change[iteration]!= change[begin])
						--begin;
					if(begin >=0){
						len = iteration-begin;
						linventory = true;
						break;
					}
				}
			}
			iteration++;
		}
		if(iteration >= 15)
			cout<<source<<" can not be classified after 15 iterations"<<endl;
		else if(inventory == true)
			cout<<source<<" is self-inventorying"<<endl;
		else if(linventory == true)
			cout<<source<<" enters an inventory loop of length "<<len<<endl;
		else if(sinventory == true)
			cout<<source<<" is self-inventorying after "<<len<<" steps"<<endl;
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值