codeforce 贪心1

走棋子到棋盘四个角,输出最小步数

codeforces

输入:m*n  (棋盘 从1开始)

        i  j  (当前位置)

       a b  (每次可以走 (i+a,j+b) (i+a,j-b) (i-a,j-b) (i-a,j+b) ) 这为一步

/************************************************* 
*
* 画个图出来就可以了~~ 
* 
**************************************************/ 

#include<iostream>
#include<cmath>
int n,m,i,j,a,b; 
const int oo = 1000000000;
using namespace std;
int find(int x,int y)
{
    if((x%a)||(y%b)) return oo; // position satisfied
    x=abs(x/a);y=abs(y/b); 
    int k=x-y;               // cout<< x << " " <<y<<" "<<k<<endl; 
    if(k&1)  return oo;      // 奇偶不同,不在交叉线上, 
    if(!k )  return y;      // 正方形对角线  
    if((k<0)){
        if((i>a)||(i+a<=n))  return y;   //留一个单位,对角线交叉着跳     
        return oo;
    }
    if((k>0)&&((j>b)||(j+b<=m)))  return x;
    return oo;
}

int main()
{ 
    ios::sync_with_stdio(0);
    cin>>n>>m>>i>>j>>a>>b;
    
    int ans,t;
    ans=min(find(i-1,j-1),find(i-1,m-j));
    t = min(find(n-i,j-1),find(n-i,m-j));  //cout<<find(n-i,m-j)<<" "<<t<<endl;
    ans=min(ans,t);
    if(ans==oo) cout<<"Poor Inna and pony!"<<endl;
    else cout<<ans<<endl;   
    
    return 0;
}

 

posted @ 2013-12-19 15:46  y丫t  阅读(213)  评论(0编辑  收藏  举报