主题是描绘现有的大奶酪。 其高度为h,其长度和宽度被认为是无限大的。 奶酪中间有很多相同半径的球形空腔。 你可以在这块奶酪里建立空间坐标系。 在坐标系中,奶酪的下面z=0,奶酪的上面z=h。
现在奶酪下面有一只小老鼠cmdmj,我知道奶酪中所有空腔中心所在的坐标。 如果两个腔正接或交叉,则cmdmj可以从一个腔跑向另一个腔,特别是如果一个腔与下表面正接或交叉,则cmdmj可以从干酪的下表面跑向腔; 如果空腔与顶面相切或相交,cmdmj可以从空腔跑到奶酪的顶面。
我想知道奶酪下面的cmdmj是否可以利用现有的空腔跑到奶酪的上面而不破坏奶酪。
输入格式每个输入文件包含多个数据集。
的第一行包含正整数t,该正整数t表示输入文件中包含的数据集的数量。
接下来是t组的数据。 各组数据的格式如下。 第一行包含三个正整数n,h和r。 两个数之间由空格分开,分别表示干酪中空孔的数量、干酪的高度和空腔的半径。
以下n行表示每行包含三个整数x、y和z,两个数字之间用空格分隔,并且孔的球心坐标为(x、y和z )。
输出形式的t行分别与t组数据的答案相对应,在第I组数据中,如果cmdmj能够从下表面跑到上表面,则输出Yes,如果不能,则输出No (都不包含引号)。
输入3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4
输出是
否
是
我之前看过牛客队比赛,但是没写。 # include bits/stdc.husingnamespacestd; #definepiACOS(-1 ) define mod 100000007 # definellonglong # defineullunsignedlonglong # definemem ) a ) memset(a ) a,0 6q[1010]; OOLCMP(nodea,node b ) {return a.z b.z; }int vis[1010]; int n,h,r; 输入标志; doubledis(doubleX1、double y1、double z1、double x2、double z2 ) { return sqrt (x1-x2 ) * (x1-x2 ) ) wnd //计算两腔距离(voidDFS(intp ) if ) q[p].zr=h ) /到达顶面的flag=1; 标记返回(if )标志==1)返回; //到达上面中止了vis[p]=1的搜索; //标记通过空腔的for(intI=0; i n; I () if ) vis ) I )==0dis ) q[p].x,q[p].y,q[i].x,q[i].y,q[i].z )=2*r cin t; wile(t----) {cin n h r; mem(q; mem(vis; for(intI=0; i n; I ) cin q[i].x q[i].y q[i].z; sort(q,q n,cmp ); //每个腔从高到低依次为flag=0 for(intI=0; i n; I () if ) q ) I ).z=r ) ) /直接接触下面开始检索DFS ) I ); }else{break; //因为是排序的,如果那个空洞不与下面接触,即使后面有空洞也做不到(小优化) if ) flag ) break; //可以到达上面并结束搜索(if ) flag ) ) {cout 'Yes' endl; }else{cout 'No' endl; }} return 0; }