房天下 > 房天下问答 > 业主生活 > 其他
  • 一道c++的问题

    请给出代码和思路Description咕噜姐少男最近看上一个女孩子,不过由于不知道对方的姓名,也不知道她所在的学院和专业,这让咕噜姐少男十分的烦恼,到目前为止,他仍然只能期待校园的偶遇,然后偷偷地看上对方几眼。最近他做出了决定,如果再遇到那个女孩,他一定要主动去和她认识。这天,学校组织活动,操场上聚集了很多的志愿者,咕噜姐少男是其中之一,事实上,那个女孩子也是其中之一,咕噜姐少男能否发现这个女孩呢?现在我们已经知道一共有N名志愿者,以及他们在操场上的位置,只有当咕噜姐少男和女孩之间没有人挡住视线时,他才可以看到她,并且,由于咕噜姐少男的视力不是很好,当他俩的距离超过L米时,他也看不出她。请你写一个程序判断一下,咕噜姐少男能否趁这次机会认识这个女孩?Input输入数据第一行为一个整数T,表示接下来一共有T组测试数据。每组测试数据的格式如下: * 第一行为两个整数N,L(2≤N≤100,1≤L≤200)。 * 从第2行到第N+1行每行两个整数,第i行的两个整数Xi,Yi表示第i名志愿者在操场上的位置(直角坐标)(0≤Xi,Yi≤100)。输入数据保证没有任何两名志愿者站在同一个位置。设咕噜姐少男为第1名志愿者,而女孩为第N名志愿者。Output输出共T行,假如第i组数据中咕噜姐少男能够看到女孩,请在第i行输出“YES”,否则请在第i行输出“NO”(输出不含引号)。Sample Input42 1000 010 102 1000 0100 1003 5015 1075 5555 404 5015 1035 2575 5555 40Sample OutputYESNOYESNO

    提问者:探索综合

    发布于2010-08-14

共1个回答
  • 天虹帝国 丨Lv 0
    思路挺简单,就是检查其它点是否在两点连线的中间,如果在就被挡住了,其它的情况就是没被挡住。另外需要提前检查相对最远距离的大小关系,更详细的自行看代码,写得也不怎么罗嗦。#include<iostream>using std::cout;using std::cin;using std::endl;int main(int argc,char *argv[]){#define MIN_ERROR (0.00001)int groupnum,i,curx[101],cury[101],*outmark;char outstr[2][16]={"NO","YES"};cin >> groupnum;outmark = new int[groupnum];for(i=0; i<groupnum ; ++i){int linenum,maxdist,j,basedx,basedy;double bscale;cin >> linenum >> maxdist;for(j=0; j<linenum; ++j)cin >> curx[j] >> cury[j];outmark[i] = 1;basedx = curx[linenum-1]-curx[0];basedy = cury[linenum-1]-cury[0];if( (basedx*basedx+basedy*basedy) > (maxdist*maxdist) ){outmark[i] = 0;continue;}if( linenum<3 ) continue;if( basedx && basedy )bscale = (double)basedy/(double)basedx;for(j=1; j<linenum-1; ++j){int curdx=curx[j]-curx[0],curdy=cury[j]-cury[0];if( ( 0==basedx && 0==curdx && ( curdy*(cury[linenum-1]-cury[j])>0 ) ) ||( 0==basedy && 0==curdy && ( curdx*(curx[linenum-1]-curx[j])>0 ) )){outmark[i] = 0;break;}else{double subv;/* assure relate point in middle */if( curdx*(curx[linenum-1]-curx[j])<0 || curdy*(cury[linenum-1]-cury[j])<0 ) continue;subv = bscale-(double)curdy/(double)curdx;if( subv<0 ) subv=-subv;if( subv<MIN_ERROR ){outmark[i] = 0;break;}}}}for(i=0; i<groupnum ; ++i)cout << outstr[outmark[i]] << endl;delete []outmark;return(0);}
    +1 2010-08-14 举报
热门人气推荐
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。