• UVALive 7070 The E-pang Palace(暴力)


      实话说这个题就是个暴力,但是有坑,第一次我以为相含是不行的,结果WA,我加上相含以后还WA,我居然把这两个矩形的面积加在一块了吗,应该取大的那一个啊……

      方法就是枚举对角线,为了让自己不蒙圈,我写了一个矩阵类,可以实现自动判断是否能成功形成矩阵,自动排序四个点,返回面积,方便以后的判断。

      C++面向对象大法好……

      代码及注释如下:

      

    #include<bits/stdc++.h>
    using namespace std;
    #define MaxN 55
    #define MaxM 222
    struct Pos{
        int x,y;
        void Set(int x1,int y1)
        {
            x = x1;
            y = y1;
        }
    }p[MaxN];
    int isp[MaxM][MaxM],n;
    bool cmp(Pos a,Pos b){
        if(a.x != b.x) return a.x < b.x;
        return a.y < b.y;
    }
    class Rec{
    public:
        Pos k[4];
        int area;
        bool Creat(Pos a,Pos b){
            k[0].x = a.x,k[0].y = a.y;
            k[1].x = b.x,k[1].y = b.y;
            k[2].x = a.x,k[2].y = b.y;
            k[3].x = b.x,k[3].y = a.y;
            sort(k,k+4,cmp);///排序便于判断
            area = abs(a.x-b.x)*abs(a.y-b.y);
            for(int i = 0;i < 4;i++){
                int tx = k[i].x,ty = k[i].y;
                if(isp[tx][ty]==0) {
                    return false;
                }
            }
            return true;
        }
    };
    bool Equal(Pos a,Pos b){
        return (a.x==b.x && a.y==b.y);
    }
    bool All_in(Pos a,Pos b,Pos c){
        return (c.x>a.x && c.x<b.x && c.y>a.y && c.y<b.y);
    }
    bool Part_in(Pos a,Pos b,Pos c){
        return (c.x>=a.x && c.x<=b.x && c.y>=a.y && c.y<=b.y);
    }
    int Check(Rec a,Rec b){
        for(int i = 0;i < 4;i++){///判断重复点
            if(Equal(a.k[i],b.k[i])) return 0;
        }
        int tot1 = 0,tot2 = 0;
        for(int i = 0;i < 4;i++){///先判断是否两个相含
            if(All_in(a.k[0],a.k[3],b.k[i])) tot1++;
            if(All_in(b.k[0],b.k[3],a.k[i])) tot2++;
        }
        if(tot1 == 4 || tot2 == 4) {
            return 2;
        }
        for(int i = 0;i < 4;i++){///不是相含,就必须相离
            if(Part_in(a.k[0],a.k[3],b.k[i])) return 0;
            if(Part_in(b.k[0],b.k[3],a.k[i])) return 0;
        }
        return 1;
    }
    int Get_ans(){
        int ans = -1;
        Rec a,b;
        for(int i = 0;i < n;i++)///枚举对角线
        {
            for(int j = i+1;j < n;j++)
            {
                if(p[i].x==p[j].x || p[i].y==p[j].y) continue;
                if(a.Creat(p[i],p[j]) == false) continue;
                for(int k = 0;k < n;k++)
                {
                    for(int q = k+1;q < n;q++)
                    {
                        if(p[k].x==p[q].x || p[k].y==p[q].y) continue;
                        if(b.Creat(p[k],p[q]) == false) continue;
                        int c = Check(a,b);
                        if(c == 1) ans = max(ans,a.area+b.area);
                        if(c == 2) ans = max(ans,max(a.area,b.area));
                        ///相含的话,选择较大的面积
                    }
                }
            }
        }
        return ans;
    }
    int main()
    {
    //    freopen("B.in.cpp","r",stdin);
        int x,y;
        while(cin>>n && n)
        {
            memset(isp,0,sizeof(isp));
            for(int i = 0; i < n; i++)
            {
                cin>>x>>y;
                p[i].Set(x,y);
                isp[x][y] = 1;
            }
            int ans = Get_ans();
            if(ans == -1) cout<<"imp"<<endl;
            else cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C#语法糖(Csharp Syntactic sugar)大汇总
    js+JQuery实现返回顶部功能
    【深入ASP.NET原理系列】--ASP.NET页面生命周期
    扩展类
    c# 扩展方法奇思妙用
    常用excel技巧
    SQL Server之数据库语句优化
    SQL Server 聚合函数算法优化技巧
    十步完全理解SQL
    SQL语句统计每天、每月、每年的数据
  • 原文地址:https://www.cnblogs.com/jifahu/p/5943922.html
Copyright © 2020-2023  润新知