青蛙的约会(续)

在上一次的贴出的青蛙问题,实在让人郁闷.所以决定好好反思,问题的根本原因.发现在自己3次的修改程序中,其中思想已经渐进与从网上Ctrl+C下的代码思想.网上的代码分析的很简单,除非是天才或是看过相关的问题,估计一般人要看蛮久才看得懂(我应该就是这一类了...),在自己分析的过程中,写下了对其中问题的理解,故将其贴上:

#include <stdio.h>
//程序中为了节省内存 没有开辟更多的内存空间 直接使用原有的变量 使其原本的意义改变
//使得程序不易看懂 整个程序使用的是相对运动的思想 但是由于整个路径相当于循环的路段
//而程序有个很好的处理 把整个问题看作追赶问题 将两者视为走得快的一直在追慢者
//所以一直以慢者做标准 相对距离定义为相对于慢者,快者要追上慢者的距离
int main()
{  
    unsigned long x,y,m,n,l;
    scanf("%ld %ld %ld %ld %ld",&x,&y,&m,&n,&l);
    if(m==n)
        printf("Impossible\n");
    else
    {
        if(m>n)
        {
            m=m-n;                //m的含义变成了两者的相对速度
            x=(y-x+l)%l;        //x的含义变成了两者相对距离
        }
        else
        {
            m=n-m;                //m的含义变成了两者的相对速度
            x=(x-y+l)%l;        //x的含义变成了两者相对距离
        }
        //把其中移动比较慢的那个当做不动。其实以上就是计算走到快那个相对走得慢的
        //相对距离 以后所定义的相对距离就是指走得快的相对走得慢的距离
        n=x/m;                //要将两者的相对距离缩得最短(不超过)的所要走的步数
        x=x%m;                //计算两者走了n步后(缩短后)的相对距离
        y=x;                //用相对运动的思想.此时y和x表示两者的相对距离。
                            //准确的说x的意义变成 原始的相对距离(用于后面的判断)
                            //y的意义变成了 做了n步后的相对距离
        while(1)
        {
            if(y==0) // 如果y为0,即是n步后两者的相对距离为0 即相遇了 输出结果并停止循环
            {
                printf("%ld\n",n);
                break;
            }
            n=n+(y+l)/m;    //由于已经是缩短到了一个最小的相对距离(没有超过) 但在多走一步
                            //就要超过 所以又要多走一个l的距离才可能追到 所以相对距离增大到y+l
                            //所以(y+l)/m步后 并加到n上
            y=(y+l)%m;      //一共走了n步后 的两者的相对距离    
            if(y==x)//如果y为x,即是n步后两者的相对距离回到了原始的相对距离 即重复了 输出结果并停止循环
            {
                printf("Impossible\n");
                break;
            }
        }
    }
    return 0;
}

这么长估计你也不想看,不过,我想仅仅是看代码,会让你更加的头痛,若是不懂还是认认真真地看注释吧.当然,每个人的理解不同.这只是我的理解罢了.其实,整个问题处理是比较巧的.值得学习!

posted @ 2009-04-28 13:51  legendmaner  阅读(125)  评论(0编辑  收藏  举报