HDU 1030 [Delta-wave]数学思维

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1030

题目大意:在这个数字塔中,求M到N的最少步数。

关键思想:看规模,搜索一定不行。抽象线性的距离计算。竖直方向,左下方向,右下方向的向量是独立的。

代码如下:

//数学,线性距离计算。抽象思维 
#include <iostream>
#include <cmath>
using namespace std;
long long N,M;
int main() {
	//n1,n2分别为N,M的层数。_x1,_x2分别为从左往右数N和M在当前层的序数,X1_,x2_分别为从右往左数的序数 
	long long n1,n2,_x1,_x2,x1_,x2_;
	long long dn,_dx,dx_;//d表示差值 
	while(cin>>N>>M){
		n1=ceil(sqrt(N)),n2=ceil(sqrt(M));//当前层数为开根号向上取整 
		_x1=N-(n1-1)*(n1-1),_x2=M-(n2-1)*(n2-1);//前n-1层共有(n-1)^2个数。等差求和 
		x1_=2*n1-_x1,x2_=2*n2-_x2;//注意虽然当前层有2n-1个数,但_x和_x的序数和并不是2n-1 
		dn=abs(n1-n2);
		_dx=abs(ceil(_x1*1.0/2)-ceil(_x2*1.0/2));//看图 
		dx_=abs(ceil(x1_*1.0/2)-ceil(x2_*1.0/2));
		cout<<dn+_dx+dx_<<endl;
	}
	return 0; 
}

  

辅助图《HDU 1030 [Delta-wave]数学思维》

 

    原文作者:哇咔咔咔
    原文地址: https://www.cnblogs.com/G-M-WuJieMatrix/p/6411747.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞