P1170 兔八哥与猎人
题目描述
兔八哥躲藏在树林旁边的果园里。果园有 M \times NM×N 棵树,组成一个 MM 行 NN 列的矩阵,水平或垂直相邻的两棵树的距离为 11。兔八哥在一棵果树下。
猎人背着猎枪走进了果园,他爬上一棵果树,准备杀死兔八哥。
如果猎人与兔八哥之间没有其它的果树,猎人就可以看到兔八哥。
现己知猎人和兔八哥的位置,编写程序判断兔子所在的位置是否安全.
输入格式
第一行为 nn,表示有 nn 组数据,每组数据的第一行为两个正整数 a_xax 和 a_yay,表示猎人的位置,第二行为两个正整数 b_xbx 和 b_yby,表示兔八哥的位置。
输出格式
共有 nn 行,每行为 yes 或 no 表示兔八哥的位置是否安全。
输入输出样例
输入 #1
1 1 1 1 2
输出 #1
no
说明/提示
1\le n \le 10^51≤n≤105,1 \le a_x, a_y, b_x, b_y \le 10^81≤ax,ay,bx,by≤108。
思路:
用数组存然后遍历中间有没有树挡着基本不可能,因为题目数字很大,所以是找规律的题,如果找到规律了就很容易做出来,要找规律那是避免不了要画图了,
我们想想猎人什么时候可以看不见兔八哥:
如果两者之间有树,那就看不见。
至于关系真的很难讲清楚,我这里佩服那些讲的清楚的人,我想直接复制他们的但不能,所以我在这里放一个链接P1170 兔八哥与猎人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),希望
可以帮助你们理解。
下面是代码
#include<iostream> #include<cmath> using namespace std; //辗转相除 int bcd(int x,int y){ //100/12=8……4 //12/4=1……0 //return 4 if(x%y==0){ return y; }else{ return bcd(y,x%y); } } int main(){ int n; //输入数据数目 cin>>n; int px,py; int rx,ry; //猎人位置和兔八哥位置 for(int i=1;i<=n;i++){ //输入位置 cin>>px>>py; cin>>rx>>ry; //如果x之差和y之差互质 //那么兔八哥位置就是不安全的 //反之安全 if( bcd( abs(rx-px),abs(ry-py))==1 ){ cout<<"no"<<endl; }else{ cout<<"yes"<<endl; } } return 0; }

浙公网安备 33010602011771号