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 }