zoukankan      html  css  js  c++  java
  • HDU 1030 Delta-wave 数学题解

    给出一个数字塔,然后求沿着数字之间的边走,给出两个数字,问其路径最短的长度是多少。

    看似一条搜索题目,只是有一定做题经验的人都知道,这个不是搜索题,直接搜索肯定超时。

    这个是依据规律计算的数学题目。

    我这里的思路是一层一层往下搜,利用层间的规律加速,实现层跃,到了同一层,或者同一个对角列的时候就能够直接计算出结果了。对角列即顺着三角形的边能直接走到目标的列。

    数学计算出层与层之间相差2,而也能够利用这个规律计算N和M所在的层和列。


    这样做由点麻烦,只是我自己琢磨出来的,不错的思路。O(∩_∩)O哈哈~

    查了下别人的题解,这个博客利用定坐标的方法:http://gisyhy.blog.163.com/blog/static/129390343201032311220935/ 非常巧妙。

    他的抽象程度更高,也就更加难自己总结出来了,只是代码就更加简单了。


    #include <stdio.h>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <limits.h>
    #include <stack>
    #include <queue>
    #include <set>
    #include <map>
    using namespace std;
    
    int main()
    {
    	int N, M;
    	while (scanf("%d %d", &N, &M) != EOF)
    	{
    		if (N > M) swap(N, M);
    		long long t = 1;
    		int i = 1;//所在行有多少格
    		while (t < N)
    		{
    			i += 2;
    			t = (long long(i+1)>>1LL) * (long long(i+1)>>1LL);
    		}
    		long long d = 1;
    		int j = 1;
    		while (d < M)
    		{
    			j += 2;
    			d = (long long(j+1)>>1LL) * (long long(j+1)>>1LL);
    		}
    		//先走行,然后走高回合
    		int lineN = int((long long)N - (t-(long long)i));//所在行第几个
    		int lineM = int((long long )M - (d-(long long)j));//每层分上下层
    		
    		int step = 0;
    
    		while (lineN != lineM && i-lineN != j - lineM && i != j)
    		{
    			step++;
    			if (lineN & 1)//基数往下走一层,到偶数
    			{
    				lineN++;
    				i += 2;				
    			}
    			else//偶数时,移动一个位
    			{
    				if (lineM < lineN) lineN--;
    				else lineN++;
    			}
    		}
    		int hi = (i+1)>>1;
    		int hj = (j+1)>>1;//所在层高
    
    		if (i == j) step += abs(lineM - lineN);
    		else step += ((hj - hi)<<1);
    
    		printf("%d
    ", step);
    	}
    	return 0;
    }



  • 相关阅读:
    Android TouchEvent 分发流程
    python基础7之python中常用的模块的总结
    C# 压缩数据传输
    C# winFrom 加载BMP 底图
    使用jQuery Ajax功能的时候需要注意的一个问题
    jQuery DOM的操作
    C# CookieExtension 使用Cookie的扩展工具类
    Web Service测试工具小汇 转
    C# 把DT 的数据转换成 list<Model> EntityByEmit
    Web下 MD5 加密与解密
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3940793.html
Copyright © 2011-2022 走看看