codeforces A. Point on Spiral 解题报告

题目链接:http://codeforces.com/problemset/problem/279/A

题目意思:给出一个坐标点(x, y),问当从(0, 0) 开始到达该点转过的拐角有多少个。(拐角是这样的:(0, 0) -> (1, 0) -> (1, 1) -> (-1, 1) -> (-1, -1) -> (2, -1) -> (2, 2) ->...),总的来说,对于每一圈可以想成它是从坐标系的第四象限开始的(x > 0 && y < 0)

       这道题考的主要是观察能力,最重要的还有细心!!

  可以发现,每一圈有四个拐角:(x, -(y+1)),(x, x),(-x, x),(-x, -x),那么求第 i 个圈时总共经过的拐角,就等于前 i-1 圈经过的拐角 + 第 i 圈经过的拐角。第 i  圈经过的拐角比较棘手,总的来说就是考细心了。特别注意的是,当输入的点为(x, -x)时,要在算出的拐角前提下再加3,因为这点实质在第 i+1 圈中,3的意思表示第 i 圈的3个拐角

     

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int x, y, ans;
10     while (scanf("%d%d", &x, &y) != EOF)
11     {
12         if (abs(x) <= 1 && abs(y) <= 1)  // 1/0
13         {
14             if (x == 0 && y == 0 || x == 1 && y == 0)   
15                 printf("0\n");
16             else if (x == 1 && y == 1)
17                 printf("1\n");
18             else if (y == 1)                
19                 printf("2\n");
20             else if (x == -1)
21                 printf("3\n");
22             else
23                 printf("4\n");
24         }
25         else
26         {    
27             if (abs(x) > abs(y))
28                 ans = (abs(x)-1) * 4;  // 前round
29             else
30                 ans = (abs(y)-1) * 4;
31             // 四角
32             if (x > 0 && abs(y) <= abs(x))
33             {
34                 if (x != -y+1)
35                 {
36                     ans += 1;
37                     if (-y == x)
38                         ans += 3;
39                 }
40             }
41             else if (y > 0 && abs(x) <= abs(y))
42                 ans += 2;
43             else if (x < 0 && abs(x) >= abs(y))
44                 ans += 3;
45             else
46                 ans += 4;
47             printf("%d\n", ans);
48         }   
49     }
50     return 0;
51 }            

 

posted @ 2014-02-16 23:30  windysai  阅读(292)  评论(0编辑  收藏  举报