你需要放置一盏灯来照亮房间的每个角落,问这是否能办到?
输入包含多组数据。
每组数据第一行是正整数n(4<=n<=100),表示房间轮廓所形成的多边形的顶点个数。
接下来n行,每行表示房间的一个顶点。
顶点按顺时针的顺序给出,房间轮廓多边形的所有边都平行于坐标轴。
输入以n=0表示结束。
对每组数据输出一行。
如果能有一种放置方法照亮房间的所有地方,输出"Yes",否则输出"No"
#include<cstdio> #include<cstring> #define inf 0x3fffffff int 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 "); else printf("No "); } }