100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【计概A期末】照亮房间

【计概A期末】照亮房间

时间:2019-11-22 06:32:43

相关推荐

【计概A期末】照亮房间

你需要放置一盏灯来照亮房间的每个角落,问这是否能办到?

输入包含多组数据。

每组数据第一行是正整数n(4<=n<=100),表示房间轮廓所形成的多边形的顶点个数。

接下来n行,每行表示房间的一个顶点。

顶点按顺时针的顺序给出,房间轮廓多边形的所有边都平行于坐标轴。

输入以n=0表示结束。

对每组数据输出一行。

如果能有一种放置方法照亮房间的所有地方,输出"Yes",否则输出"No"

#include<cstdio>#include<cstring>#define inf 0x3fffffffint n,ok; int x1,x2,y1,y2; //在x和y方向上的合法范围(边界). int x[101],y[101];//由于是顺时针读取且平行于坐标轴,所以相邻读取的两个点可以确定出x或y的范围 int check(int px,int py,int cx,int cy){ //分别是前一个点(px,py)和当前点(cx,cy) if(px==cx){ //x相同y不同,则限制x1或x2 if(cy>py){ //当前点在之前点正上方,所以应该限制x1(因为是顺时针给出点) x1=x1>cx?x1:cx;return x1<=x2?1:0;}else{//当前点在之前点的正下方,所以应该限制x2 x2=x2<cx?x2:cx;return x2>=x1?1:0;}}else{//同理对于y相同而x不同,则限制y1或y2 if(cx>px){y2=y2<cy?y2:cy;return y2>=y1?1:0;}else{y1=y1>cy?y1:cy;return y1<=y2?1:0;}}}int main(){while(scanf("%d",&n)==1&&n){ok=1;x1=y1=-inf,x2=y2=inf; scanf("%d%d",&x[1],&y[1]);for(int i=2;i<=n;i++){scanf("%d%d",&x[i],&y[i]);if(!ok) continue;ok=check(x[i-1],y[i-1],x[i],y[i]);}if(ok) ok=check(x[n],y[n],x[1],y[1]); //要单独考虑最后一个点和第一个点 if(ok) printf("Yes\n");else printf("No\n");}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。