
题目链接: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题都不简单啊~~~
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <limits.h>
using namespace std; int n, m, i, j, a, b; int check(int corner_x, int corner_y)
{
if (corner_x == i && corner_y == j)
return ;
if (i + a > n && i - a < || j + b > m && j - b < ) // 边界处理
return INT_MAX;
int diff_x = abs(corner_x - i);
int diff_y = abs(corner_y - j);
if (diff_x % a || diff_y % b) // 步数要为整数
return INT_MAX;
int div_x = diff_x / a;
int div_y = diff_y / b;
if ((!(div_x&) && div_y&) || (div_x&) && !(div_y&)) // 移动的次数要同时为奇数或偶数
return INT_MAX;
return max(div_x, div_y);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
while (scanf("%d%d%d%d%d%d", &n, &m, &i, &j, &a, &b) != EOF)
{
int ans = INT_MAX;
ans = min(check(,), check(,m));
ans = min(ans, check(n,));
ans = min(ans, check(n,m));
if (ans == INT_MAX)
printf("Poor Inna and pony!\n");
else
printf("%d\n", ans);
}
return ;
}