HDOJ HDU 1030 Delta-wave

来源:互联网 发布:windows.old删不掉 cmd 编辑:程序博客网 时间:2024/06/06 14:19

HDOJ HDU 1030 Delta-wave

题目

点击查看 HDOJ HDU 1030 Delta-wave

题意

给出图
HDOJ 1030 题目图
按如图所示的方法对每个三角 进行标号
求 两标号三角形 的 距离 (穿过边的数量 )

例如 6 12
经过6-7、7-13、13-12(其他的路最短的也为 3)
所以 为 3

题解

看到 有其他思路
这里就说说我的思路
- 我把 每个 1上1下三角形组成的四边形 看作一个单元格
- 把 右斜向一排元素 看作一行
- 把 左斜向一排元素 看作一列
- 把 横向一排元素 看作一层

例如
1 3在一个单元
1 3 4 8 9 15 在第一行
1 3 2 6 5 11 在第一列
5 6 7 8 9 在第三层

这样问题转化为 求 两单元格的距离(再细分每个元素 在单元格的 上 还是 下 即可) + 层数距离

例如
1 的坐标 (1,1) 第1层
14 在 (2,3) 第3 层
两单元格 要穿过 2 - 1 + 3 - 1 个
而 要穿过 3 - 1层
共穿过 5

现在看 单元格坐标(r,c)的 求法
这里我的 思想是
先求 每行 行首元素 的 层数 t
设 d 是 元素 到层首元素的 距离 则
r = t - (d+1)/21. (仔细观察)
c = d/2+1
接下解决 t 怎么求
我们注意到 第 n 层 末尾元素 都是 n^2
所以 我们只要 对元素开根 下取整 + 1即可 ( 注意 ! 每行最后元素应与该行元素计算一致所以 元素号 要 -1)
所以 a元素 的层数 t 为 t=(a1)+1
d怎么求
设改层首元素的序号为 s 所以
所以 a元素 到 s 的 距离为 d - s
s怎么求
该行首元素 可以是 上层 末元素 + 1
所以 a元素 该层 的 首元素 s 为 s=((a1))2+1

例如
求 7 和 16的距离
先求 7 的 层数 t = (7)+1=3
再求 7 这层的 首元素 s = ((71))2+1=5
再求 d = 7 - 5 = 2
r = 3 - (2+1)/2 = 2
c = 2/2+1 = 1
求得 7 的坐标 (2, 2) 层数 3
同理得 16 的坐标 (1, 4) 层数 4
穿过 abs(1-2) + abs(2-4) + abs(4-3) = 4
没找到 MathJax的绝对值 所以 用 abs代替了 知道的朋友回复我

代码

Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta#include <iostream>#include <cmath>using namespace std;int main(){    int m,n,r1,c1,r2,c2,t1,t2,s,ans;    bool g1,g2;    while(cin >> m >> n)    {        ans = 0;        if(m%2 == 0)            g1 = true;        else g1 =false;        if(n%2 == 0)            g2 = true;        else g2 = false;        if(m != 1)        {            t1 = sqrt(m-1);            s = t1 * t1 + 1;            t1++;//            cout << t1 << endl;            s = m  - s;            r1 = t1 - (s + 1)/2;            c1 = 1 + s/2;        }         else{            t1 = r1 = c1 = 1;        }        if(n != 1)        {            t2 = sqrt(n-1);            s = t2 * t2 + 1;            t2++;//            cout << t2 << endl;            s = n  - s;            r2 = t2 - (s + 1)/2;            c2 = 1 + s/2;        }else{            t1 = r2 = c2 = 1;        }        ans = abs(r1-r2)  + abs(c1-c2) + abs(t1-t2);        cout << ans << endl;    }    return 0;}

  1. x表示对 x 下取整 ↩
原创粉丝点击