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
",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.
",a,b,ans) ;
68     }
69     return 0 ;
70 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3920254.html