【2016计概A期末】照亮房间

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

输入包含多组数据。 
每组数据第一行是正整数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
");
    }
}
原文地址:https://www.cnblogs.com/sulley/p/8169324.html