青蛙的约会(续)
在上一次的贴出的青蛙问题,实在让人郁闷.所以决定好好反思,问题的根本原因.发现在自己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;
}
这么长估计你也不想看,不过,我想仅仅是看代码,会让你更加的头痛,若是不懂还是认认真真地看注释吧.当然,每个人的理解不同.这只是我的理解罢了.其实,整个问题处理是比较巧的.值得学习!