HDU:1577 WisKey的眼神
2017-03-18 18:28
309 查看
WisKey的眼神
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3882 Accepted Submission(s): 1128
题目链接
Problem 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
解题思路:解题的关键是如何去判断,两点之间没有其他点。首先判断abs(px) 和 abs(py) 有没有大于L的,如果有,则超界了,不用再考虑。对于没有超界的点,我将情况分为八中,第一种点(px,py)在点(sx,sy)的右上方,第二种(px,py)在点(sx,sy)的右下方,第三种点(px,py)在点(sx,sy)的左上方,第四种情况是点(px,py)在点(sx,sy)的左下方。首先举例第一种情况,如果确定两点之间没有其他点。则要判断两点的连线与两点之间每个整数Y值的交点的横坐标是不是整数。如下图所示:
因此对于px>sx && py>sy的情况。首先两点之间的水平距离为: X = px - sx 两点之间的竖直距离为: Y = py - sy则要判断两点之间有没有其他点的做法为for(j = py-1; j > sy; j--){ y = j-sy; //为两点间直线与 j这条水平直线的交点距点(sx,sy)的垂直距离 if((y*X)%Y==0) { 则有其他的点。 break; }}然后考虑上面所列的其他三种情况。然后考虑上(px,py)在点(sx+1,py),(sx-1,py),(sx,py+1),(sx,py-1)这四个点的情况就可以了。
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <map> #include <set> #include <stack> #include <queue> #include <stdlib.h> using namespace std; int main() { int L,sx,sy,px,py,j,X,Y,y; while(~scanf("%d",&L)) { if(L == 0) { break; } scanf("%d%d%d%d",&sx,&sy,&px,&py); if(abs(px)>L || abs(py)>L) printf("Out Of Range\n"); else { int flag = 0; if(px>sx && py>sy) { X = px-sx; Y = py-sy; for(j = py-1; j >sy; j--) { y = j-sy; if((X*y)%Y==0) { flag = 1; break; } } } else if(px>sx && py<sy) { X = px-sx; Y = sy-py; for(j = py+1; j < sy; j++) { y = sy-j; if((X*y)%Y==0) { flag = 1; break; } } } else if(px < sx && py > sy) { X = sx - px; Y = py - sy; for(j = py-1; j > sy; j--) { y = j-sy; if((X*y)%Y==0) { flag = 1; break; } } } else if(px < sx && py < sy) { X = sx - px; Y = sy - py; for(j = py+1; j < sy; j++) { y = sy-j; if((X*y)%Y==0) { flag = 1; break; } } } else if(sx == px && py > sy+1) flag = 1; else if(sx == px && py < sy-1) flag = 1; else if(sy == py && px > sx+1) flag = 1; else if(sy == py && px < sx-1) flag = 1; if(flag) printf("No\n"); else printf("Yes\n"); } } return 0; }
相关文章推荐
- hdu 1577 WisKey的眼神
- hdu 1577 WisKey的眼神
- HDU 1577 WisKey的眼神
- I - WisKey的眼神 HDU - 1577
- 【hdu】1577 WisKey的眼神(两个点之间是否存在整数坐标)
- hdu 1577 WisKey的眼神(gcd判断直线上的整点)
- I - WisKey的眼神 HDU - 1577【数学】【思维】
- hdu 1577【WisKey的眼神】
- WisKey的眼神(hdu 1577)
- HDU 1577 WisKey的眼神 (GCD求直线上的点数)
- hdu 1577 WisKey的眼神 (数学几何)
- 【hdoj】1577 WisKey的眼神
- WisKey的眼神 HDU - 1577 gcd
- 杭电OJ题 1577 WisKey的眼神 解题报告
- HDU1577 WisKey的眼神
- HDU1577-WisKey的眼神
- hdu 2603 Wiskey's Power(数学题),待改正
- WisKey的眼神
- hdu——2603——Wiskey's Power
- HDU 1577 判断两点之间是否存在整数点