hdu1030

hdu 1030 Delta-Wave 
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
	double m,n;
	int nearest1,nearest2;
	int layerDistance,tempDistance,realDistance;
	int placeInRow;
	while(cin>>m>>n)
    {
	if(m>n)
	{
		int k=m;
		m=n;
		n=k;
	}
	double m1=sqrt(m);
	double n1=sqrt(n);
	if(m1-int(m1)!=0)
		m1=(int)m1+1;
	if(n1-int(n1)!=0)
		n1=(int)n1+1;
	if(m1==n1)
		cout<<(int)n-(int)m;
	else
	{
	    layerDistance=2*(n1-m1-1);
		placeInRow=m-(m1-1)*(m1-1);
		nearest1=placeInRow+(n1-1)*(n1-1);
		nearest2=nearest1+layerDistance+2;
		tempDistance=layerDistance+2;
		if(((int)m%2==0&&int(m1)%2==0)||((int)m%2!=0&&int(m1)%2!=0))
		{
			tempDistance-=1;
			nearest1+=1;
			nearest2-=1;
            if(nearest1<=n&&nearest2>=n)
			{
				if((int)nearest1%2==(int)n%2)
					realDistance=tempDistance;
				else
				{
                    realDistance=tempDistance+1;
				}
			}
			else
			{
				int t=abs(n-nearest1)>abs(n-nearest2)? abs(n-nearest2):abs(n-nearest1);
			    realDistance=tempDistance+t;
			}
			cout<<realDistance;

		}
		else
		{
			if(nearest1<=n&&nearest2>=n)
			{
				if((int)nearest1%2==(int)n%2)
					realDistance=tempDistance;
				else
				{
                    realDistance=tempDistance+1;
				}
			}
			else
			{
				int t=abs(n-nearest1)>abs(n-nearest2)? abs(n-nearest2):abs(n-nearest1);
				realDistance=tempDistance+t;
			}
			cout<<realDistance;
		}
		cout<<endl;
		}
	



	}

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值