hust_Sum the Square

 //题目大意:给两个数据,各个位的数的平方和就是他的下一个数.请问这两个数据形成的数列中出现第一个系统数据时,两个数列的长度.

//PS:第一个数据如果太大,要处理掉.其他的可以用数组直接记录

 

#include<stdio.h>
#include<string.h>
int first[1000],second[1000],fStep[1000],sStep[1000];
int in1,in2,x1,y1,x2,y2,i,j,step,minf,mins,px,py;
int qk;//0代表未找到,1代表2数在1圈的圈外(包括入圈点),2代表在圈内.
bool f[1000],s[1000];

int GetNum(int k)
{
	int sum=0,m;
	while(k)
	{
		m=k%10;
		sum+=m*m;
		k/=10;
	}
	return sum;
}
int main()
{
	while(scanf("%d%d",&x1,&y1))
	{
		if(!x1&&!y1) break;
		memset(f,false,sizeof(f));
		memset(s,false,sizeof(s));
		qk=0;//表示未找到
		px=x1,py=y1;//输出原数用
		if(px==py)
		{
			printf("%d %d 2\n",px,py);
			continue;
		}
		//第一个数画圈
		step=1;
		//解决第一个数过大问题
		if(px<1000)
		{
			f[x1]=true;
			fStep[x1]=step++;
		}
		else
		{
			x1=GetNum(x1);
			step++;
			f[x1]=true;
			fStep[x1]=step++;
		}
		x2=GetNum(x1);
		while(!f[x2])
		{
			first[x1]=x2;
			f[x2]=true;
			fStep[x2]=step++;
			x1=x2;
			x2=GetNum(x1);
		}
		first[x1]=x2;
		in1=x2;//记录进入圈的步数
		//深搜第二个数
		step=1;
		//解决第二个数过大问题
		if(py<1000)
		{
			s[y1]=true;
			sStep[y1]=step++;
		}
		else
		{
			y1=GetNum(y1);
			step++;
			s[y1]=true;
			sStep[y1]=step++;
		}
		if(f[y1])
		{
			y2=y1;
			if(fStep[y2]<=fStep[in1])
				qk=1;
			else
			{
				qk=2;
				in2=y2;
			}
		}
		else
		{
			y2=GetNum(y1);
			while(!s[y2])
			{
				second[y1]=y2;
				s[y2]=true;
				sStep[y2]=step++;
				//判断该数是否已经在画第一个圈时出现过
				if(f[y2])
				{
					if(fStep[y2]<=fStep[in1])
						qk=1;
					else
					{
						qk=2;
						in2=y2;
					}
					break;
				}
				y1=y2;
				y2=GetNum(y1);
			}
		}
		if(qk==0) printf("%d %d 0\n",px,py);
		else if(qk==1) printf("%d %d %d\n",px,py,fStep[y2]+sStep[y2]);
		else
		{
			int min,now;
			//算出in2到in1的距离
			now=in2;
			step=0;
			while(now!=in1)
			{
				now=first[now];
				step++;
			}
			min=step;
			if(fStep[in2]-fStep[in1]<min) min=fStep[in2]-fStep[in1];
			step=min;
			printf("%d %d %d\n",px,py,fStep[in1]+sStep[in2]+step);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值