递归例题,判断到达问题
题目描述:
对于任意一点(x, y),假设只有两种移动方式:(x, y) ->(x, x + y) ,(x, y) -> (x + y, y)。给定起点坐标(x1, y1),判断是否可以只通过上述移动方式到达终点坐标(x2, y2)。例如起点坐标为 (2, 10),终点坐标为(26, 12),
则 (2, 10)->(2, 12)->(14, 12)->(26, 12) 是有效的移动方式,可以从起点到达终点。
提示:判断能否从(x1,y1)通过限定的两种移动方式移动到(x2,y2),可以转化为判断能否从(x1,x1+y1)通过限定的两种移动方式移动到(x2,y2)以及能否从(x1+y1,y1)通过限定的两种移动方式移动到(x2,y2)。
输入:
第一行为起点坐标,第二行为终点坐标。
输出:
如果可以通过上述移动方式到达终点,输出Yes.,否则输出No.
样例输入:
2, 10
26, 12
样例输出:
Yes.
#include <stdio.h>
#include <math.h>
#include <string.h>
//递归的运用
int di(int x,int y,int a,int b)
{
if(x+y==a+b&&(a==x)&&(b==y)) return 1; //一旦符合条件就返回一
else if (x+y>a+b||x>a||y>b) return 0;//只要超出范围就返回 0
//就是递归函数里x>a ||y>b就行
else return di(x+y,y,a,b)+di(x,x+y,a,b);//xy还小就继续加?
}//只要递归过程中有一个符合,返回值就不是0
int main()
{
int x,y;
int a,b;
scanf("%d,%d",&x,&y);
scanf("%d,%d",&a,&b);
if(di(x,y,a,b)==0)
{
printf("No.\n");
}
else printf("Yes.\n");
}