POJ 1870 Bee Breeding(找规律)

题目链接

题意 : 给你一个蜂巢状图形,让你找出两个点之间的距离。

思路 : 在做这个题之前可以看一下2265,因为是一种题来着,规律就是我在2265里写的那样,然后就是求距离了,求距离的时候只需考虑两个点的坐标差值(x,y),把坐标差值分成四个项限,x>0且y>0,或x<0且y<0为abs(x+y),其他情况则是max(abs(x),abs(y))。。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <iostream>

 4 #include <cmath>

 5 #include <cstdlib>

 6 

 7 using namespace std ;

 8 

 9 void val(int a,int &x,int &y)

10 {

11         int n = 0;

12         while(3 * (n-1) * n + 1 < a)

13             n++;

14         n--;

15         if(n == -1)

16         {

17             x = 0 ;

18             y = 0 ;

19             return ;

20         }

21         a -= 3*(n-1)*n+1;

22         if(a<=n)

23         {

24             x = n-a;

25             y = a;

26         }

27         else if(a>n&&a<=2*n)

28         {

29             x = n-a;

30             y = n;

31         }

32         else if(a>2*n&&a<=3*n)

33         {

34             x = -n;

35             y = 3*n-a;

36         }

37         else if(a>3*n&&a<=4*n)

38         {

39             x = a-4*n;

40             y = 3*n-a;

41         }

42         else if(a>4*n&&a<=5*n)

43         {

44             x = a-4*n;

45             y = -n;

46         }

47         else

48         {

49             x = n;

50             y = a-6*n;

51         }

52 }

53 int main()

54 {

55     int a,b ;

56     while(scanf("%d %d",&a,&b) !=EOF)

57     {

58         if(a == 0 && b == 0) break ;

59         int xa,ya,xb,yb ;

60         val(a,xa,ya) ;

61         val(b,xb,yb) ;

62       //  printf("%d %d %d %d\n",xa,ya,xb,yb) ;

63         int ans = 0 ;

64         if((xa-xb)*(ya-yb) <= 0)

65             ans = max(abs(xa-xb),abs(ya-yb)) ;

66         else ans = abs(xa-xb)+abs(ya-yb) ;

67         printf("The distance between cells %d and %d is %d.\n",a,b,ans) ;

68     }

69     return 0 ;

70 }
View Code

 

你可能感兴趣的:(poj)