zoukankan      html  css  js  c++  java
  • C++ 矩形交集和并集的面积-离散化

    //离散化,x,y坐标分别按从小到大排序
    //离散化
    //1、首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中.
    //2、 设数组XY[ ][ ].对于每个矩形(x1,y1)(x2,y2)确定i1,i2,j1,j2,使得,X[i1]>x1,X[i2]<=x2,Y[i1]>y1,Y[i2]>=y2令XY[ i ][ j ] = 1 (i从i1到i2,j从j1到j2)
    //3、统计面积:area+=XY[i][j] *(X[i]-X[i-1])*(Y[i] – Y[i-1])
     
    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include <algorithm>
    using namespace std;
    double x[201],y[201],s[101][4];
    int xy[201][201] = {0};
    int n,cas=0;
    double sum1; // 并集面积
    double sum2; // 交集面积
    int main()
    {
        int i,j,k;
        while(cin>>n)
        {   
            if(n==0)
                break;
            cas++;
            k=0;
            sum1 = 0.0;
            sum2 = 0.0;
            memset(xy,0,sizeof(xy));
            for(i=1;i<=n;i++)
            {
                cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3];
                x[k]=s[i][0];
                y[k]=s[i][1];
                k++;
                x[k]=s[i][2];
                y[k]=s[i][3];
                k++;
            }
            sort(x,x+2*n);
            sort(y,y+2*n);
            int kk = 0;
            for(k=1;k<=n;k++)
            {
                int i1,i2,j1,j2;
                for(i1=0;i1<2*n;i1++)
                {
                    if(x[i1]==s[k][0])
                        break;
                }
                for(i2=0;i2<2*n;i2++)
                {
                    if(x[i2]==s[k][2])
                        break;
                }
                for(j1=0;j1<2*n;j1++)
                {
                    if(y[j1]==s[k][1])
                        break;
                }
                for(j2=0;j2<2*n;j2++)
                {
                    if(y[j2]==s[k][3])
                        break;
                }
                for(i=i1;i<i2;i++)
                {
                    for(j=j1;j<j2;j++)
                    {
                        xy[i][j] |= 1<<(k-1);
                    }
                }
                kk |= 1<<(k-1); // 所有bit都置为1
            }
            
            for(i=0;i<2*n;i++)
            {
                for(j=0;j<2*n;j++)
                {
                    sum1 += ((xy[i][j] != 0 ? 1:0)*(x[i+1]-x[i])*(y[j+1]-y[j])); // 只要!=0,说明至少有一个矩形占据过
                    sum2 += ((xy[i][j] == kk ? 1:0)*(x[i+1]-x[i])*(y[j+1]-y[j])); // 每个矩形都占据过这里
                }
            }
            printf("Test case #%d
    ",cas);
            printf("并集面积: %.2f
    ",sum1);
            printf("交集面积: %.2f
    ",sum2);
            printf("
    ");
        }
        return 0;
    }
    View Code

    输入:

    2
    10 10 20 20
    15 15 25 25.5

    输出:

    Test case #1
    并集面积: 180.00
    交集面积: 25.00

    输入:
    3
    10 10 20 20
    15 8 30 15
    17 13 25 25

    输出:

    Test case #2
    并集面积: 245.00
    交集面积: 6.00

    转自:https://blog.csdn.net/fall221/article/details/12314489?locationNum=10&fps=1

  • 相关阅读:
    前端导出excel文件
    promise和async/await的用法
    vue element 导出 分页数据的excel表格
    mac net.core 安装问题总结
    npm报MSBUILD错误的解决办法
    现大前端开发环境配置
    git 常用命令
    NodeJs (一)
    VUE 组件通信、传值
    vue-cli 第一章
  • 原文地址:https://www.cnblogs.com/zebra-bin/p/13524289.html
Copyright © 2011-2022 走看看