HDU1577 (gcd)

Description

WisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵呵.
但是Rabbit总是喜欢扮神秘,一天WisKey去食堂排队等着买饭,突然收到一道短消息,是Rabbit发的,”呵呵,又看见你了,你没看 到我吧”.WisKey马上拉长脖子扫描食堂,可是就是看不到,再发短信问Rabbit在哪,Rabbit回信曰”我已经在寝室了”.WisKey无 语.... 假设食堂是个正方形,食堂中心坐标为(0,0),长度为2*L, WisKey保证在食堂内. 因为是吃饭高峰期,所以每个点上都站着人,当某些人处在同一直线上时就有可能被前面的人挡住. 聪明的ACMer请你帮帮WisKey,告诉他能不能看见Rabbit.

Input
输入L,sx,sy,px,py; L<=1000,sx,sy是WisKey的坐标,px,py是Rabbit的坐标. 以L=0为结束.

Output
对于每组输入数据,能看见输出”Yes”,看不见输出”No”. Rabbit不在食堂输出”Out Of Range”.

Sample Input
5 0 0 1 1
5 0 0 2 0
5 0 0 6 6
5 0 0 -1 -1
0
Sample Output
Yes
No
Out Of Range
Yes

 

其实这道题有无那个图都是一样的,有了的话的却给了我们一个很直观的印象,但反倒影响了我们的思维。当时我就在图上一顿找玄机,结果比赛结束了也没有过,还记得我当时的错误想法是看看座标间能不能整除。听了题解后才明白,哦原来是gcd啊!!!!用gcd的合理性也很明显,若gcd(abs(px-sx),abs(py-sy))==1,就说两点连线上再也没有其他的坐标了。一开始补题的的时候,我想到了一组样例 6 2 3 3 6 根据这组样例 我的想法是gcd(px,sx)==1 || gcd(py,sy)==1 对这组样例来说倒是满足,带着不安试一试吧!交上去WA了。想了想,想到了5 2 1 4 5 对横纵坐标分别求gcd也符合了判断条件,但把两个点连起来发现,直线穿过了(2,2)这个点。再想了想,于是便有了解。*************************(补充一句 我刚开始以为一个非0整数不能和0求gcd于是还加了个特判的条件,但又写了个gcd测试以后发现0与非0整数求gcd得那个非0整数,当然了不加这特判条件也是可以过的)。

 

有什么不合理的地方 请各位大佬为在下指出~~~~~

#include<bits/stdc++.h>

int abs(int x){
	return x>0?x:-x;	
}
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

int main(){
	int L,sx,sy,px,py;
	while(scanf("%d",&L)==1&&L){
		scanf("%d %d %d %d",&sx,&sy,&px,&py);
		if(abs(px)>L||abs(py)>L){
			printf("Out Of Range\n");
			continue;
		}
		if(abs(px-sx)==1&&abs(py-sy)==1){
			printf("Yes\n");
		}
		else if((gcd(abs(px-sx),abs(py-sy))==1)&&abs(px-sx)!=0&&abs(py-sy)!=0){
			printf("Yes\n");
		}
		else{
			printf("No\n");
		}	
	} 
	return 0;
}

 

原文地址:https://www.cnblogs.com/gjy963478650/p/7243508.html