代码改变世界

1422. Table Tennis

2011-05-08 17:16  Min·zc  阅读(208)  评论(0编辑  收藏  举报

假设球碰到横边或者总边都不会发生方向的改变,那么就相当于将球的路线完全展开来看,我们会发现,求横向和纵向行走的距离刚好都是横纵边长的最小公倍数。之后就可以求得横纵边各走了几个,每走一个就在相应的一条边发生了一次碰撞。原因如下:比如变长分别是2和3,最大公约数就是6,也就是说最终球进洞的时候横向和纵向都走了6个单位。但是实际横向边最长只有3,如果想继续前进,只能调头,所以发生了纵向边的碰撞。

最后根据横向和纵向碰撞的次数就可以确定最终的进洞是哪一个。因为最后进洞的时候横向和纵向的碰撞是不算的,所以需要各减少1

---------------------------------------------------------------------------------------------------------------------------

 1 #include <iostream>
 2 using namespace std;
 3 int m,n;
 4 int gcd(int a,int b)
 5 {
 6         if(b==0)
 7                 return a;
 8         else 
 9                 return gcd(b,a%b);
10 }
11 int main()
12 {
13         while(cin>>m>>n)
14         {
15                 int x,y;
16                 y=x=0;
17                 int plu=gcd(m,n);
18                 int ansx,ansy;
19                 ansx=n/plu-1;
20                 ansy=m/plu-1;
21                 if(ansx%2==0&&ansy%2==0)
22                         cout<<"C";
23                 else if(ansx%2==1&&ansy%2==0)
24                         cout<<"D";
25                 else if(ansx%2==0&&ansy%2==1)
26                         cout<<"B";
27                 else if(ansx%2==1&&ansy%2==1)
28                         cout<<"A";
29                 cout<<" "<<ansx+ansy<<endl;
30         }
31 }
32