【hdu1030】“坐标表示法”

http://acm.hdu.edu.cn/showproblem.php?pid=1030

算法:以顶点为原点,建立坐标系,一个数可以唯一对应一个三元组(x, y, z),从任意一个点出发走一步,刚好有三种情况,分别对应x, y, z变化1,而其它两个坐标保持不变。因此,求出两个点的坐标分别为(x1, y1, z1), (x2, y2, z2);则它们之间的距离为|x1 - x2| + |y1 - y2| + |z1 - z2|。

代码如下:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <cmath>

 5 #include <algorithm>

 6 #include <map>

 7 #include <vector>

 8 #include <stack>

 9 #include <string>

10 #include <ctime>

11 #include <queue>

12 #define mem0(a) memset(a, 0, sizeof(a))

13 #define mem(a, b) memset(a, b, sizeof(a))

14 #define lson l, m, rt << 1

15 #define rson m + 1, r, rt << 1 | 1

16 #define eps 0.0000001

17 #define lowbit(x) ((x) & -(x))

18 #define memc(a, b) memcpy(a, b, sizeof(b))

19 #define x_x(a) ((a) * (a))

20 #define LL long long

21 #define DB double

22 #define pi 3.14159265359

23 #define MD 10000007

24 #define INF maxNum

25 #define max(a, b) ((a) > (b)? (a) : (b))

26 using namespace std;

27 struct Point {

28         int x, y, z;

29         Point(int n) {

30                 int xx = (int)sqrt(n + 0.5);

31                 if(xx * xx  < n) xx++;

32                 y = xx;

33                 z = x = y;

34                 int p = (y - 1) * (y - 1);

35                 x -= (n - p) / 2;

36                 p = y * y + 1;

37                 z -= (p - n) / 2;

38         }

39 };

40 int main()

41 {

42         //freopen("input.txt", "r", stdin);

43         int a, b;

44         while(~scanf("%d%d", &a, &b)) {

45                 Point x(a), y(b);

46                 int ans = abs(x.x - y.x) + abs(x.y - y.y) + abs(x.z - y.z);

47                 printf("%d\n", ans);

48         }

49         return 0;

50 }
View Code

 

你可能感兴趣的:(HDU)