codeforces 374A Inna and Pink Pony 解题报告

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

题目意思:给出一个 n 行  m 列 的棋盘,要将放置在坐标点为(i, j)的 candy 移动到四个角落(1,1),(1,m),(n, 1),(n, m) 中的其中一个。假设当前在位置(x, y),规定每次移动遵循,(x+a, y+b) 、 (x+a, y-b)、 (x-a, y+b)、(x-a, y-b)。求最小的移动次数。

    求出 (i, j) 到每个角落的距离diff_x, diff_y,而且diff_x 必须要除得尽 a, diff_y除得尽 b,这个很好理解,次数嘛~~~除此,除完之后这两个值必须是同奇或同偶。还有就是移动的时候不能超出边界,在边界时的特判了~~~~

    A题都不简单啊~~~

    

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <limits.h>
 6 using namespace std;
 7 
 8 int n, m, i, j, a, b;
 9 
10 int check(int corner_x, int corner_y)
11 {
12     if (corner_x == i && corner_y == j)
13         return 0;
14     if (i + a > n && i - a < 1 || j + b > m && j - b < 1)  // 边界处理
15         return INT_MAX;
16     int diff_x = abs(corner_x - i);
17     int diff_y = abs(corner_y - j);
18     if (diff_x % a || diff_y % b)  // 步数要为整数
19         return INT_MAX;
20     int div_x = diff_x / a;
21     int div_y = diff_y / b;
22     if ((!(div_x&1) && div_y&1) || (div_x&1) && !(div_y&1))  // 移动的次数要同时为奇数或偶数
23         return INT_MAX;
24     return max(div_x, div_y);
25 }
26 
27 int main()
28 {
29     #ifndef ONLINE_JUDGE
30         freopen("input.txt", "r", stdin);
31     #endif
32     while (scanf("%d%d%d%d%d%d", &n, &m, &i, &j, &a, &b) != EOF)
33     {
34         int ans = INT_MAX;
35         ans = min(check(1,1), check(1,m));
36         ans = min(ans, check(n,1));
37         ans = min(ans, check(n,m));
38         if (ans == INT_MAX)
39             printf("Poor Inna and pony!\n");
40         else
41             printf("%d\n", ans);
42     }
43     return 0;
44 }

 

posted @ 2014-10-29 23:11  windysai  阅读(238)  评论(0编辑  收藏  举报