欢迎光临散文网 会员登陆 & 注册

递归例题,判断到达问题

2022-06-21 16:16 作者:偶尔k  | 我要投稿


题目描述:

对于任意一点(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");
}

 


递归例题,判断到达问题的评论 (共 条)

分享到微博请遵守国家法律