zoukankan      html  css  js  c++  java
  • 【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
    ");
        }
    }
  • 相关阅读:
    read和write函数
    Android开发(20)--RadioGroup的使用
    利用Excel批量高速发送电子邮件
    NOTIFYICONDATA结构
    辞职信模板
    使用markdown语法撰写csdn博客
    算法笔记2-优先队列(堆)(上)
    湖南两初中女生水库溺亡的最新相关信息
    《cracking the coding intreview》——链表
    java算法集训代码填空题练习1
  • 原文地址:https://www.cnblogs.com/sulley/p/8169324.html
Copyright © 2011-2022 走看看