首页 > 代码库 > The E-pang Palace

The E-pang Palace

题目:HDU5128 The E-pang Palace

解题思路:1.由于pillar的个数只有30个,故rectangular的个数最多15*14/2=105个,故可用暴力解法枚举rectangular的个数。

     2.把每个点都作为rectangular左下角的点,进行枚举所有。

     3.把找到的rectangular保存左下角和右上角x,y的坐标。

     4.把找到的rectangular进行两两判断是否符合条件,找到最大的面积和。

     5.注意2个rectangular嵌套的情况也是符合条件的,并且只算大的rectangular的面积。

代码如下:

 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4  5 using namespace std; 6  7 struct Pillar 8 { 9     int x;10     int y;11 }pillar[35];12 13 struct Rect14 {15     int x1;16     int y1;17     int x2;18     int y2;19 }rect[1000];20 21 int mp[210][210];22 23 int main()24 {25     int n;26     while (scanf("%d", &n) && n)27     {28         int l = 0;29         memset(mp, 0, sizeof(mp));30         int i, j, k;31         for (i = 0; i < n; i++)32         {33             scanf("%d%d", &pillar[i].x, &pillar[i].y);34             mp[pillar[i].x][pillar[i].y] = 1;35         }36         for (i = 0; i < n; i++)37         {38             for (j = pillar[i].x + 1; j <= 200; j++)39             {40                 if (mp[j][pillar[i].y])41                 {42                     for (k = pillar[i].y + 1; k <= 200; k++)43                     {44                         if (mp[pillar[i].x][k] && mp[j][k])45                         {46                             rect[l].x1 = pillar[i].x;47                             rect[l].y1 = pillar[i].y;48                             rect[l].x2 = j;49                             rect[l].y2 = k;50                             l++;51                         }52                     }53                 }54             }55         }56         int sum = 0;57         for (i = 0; i < l; i++)58         {59             for (j = i + 1; j < l; j++)60             {61                 int s = 0;62                 if ((rect[i].x1 - rect[j].x1) * (rect[i].x2 - rect[j].x2) < 0 && (rect[i].y1 - rect[j].y1) * (rect[i].y2 - rect[j].y2) < 0)63                 {64                     s = max((rect[i].y2 - rect[i].y1) * (rect[i].x2 - rect[i].x1), (rect[j].y2 - rect[j].y1) * (rect[j].x2 - rect[j].x1));65                 }66                 else if (rect[i].x1 > rect[j].x2 || rect[i].x2 < rect[j].x1 || rect[i].y1 > rect[j].y2 || rect[i].y2 < rect[j].y1)67                 {68                     s = (rect[i].y2 - rect[i].y1) * (rect[i].x2 - rect[i].x1) + (rect[j].y2 - rect[j].y1) * (rect[j].x2 - rect[j].x1);69                 }70                 sum = max(sum, s);71             }72         }73         if (sum)74         {75             printf("%d\n", sum);76         }77         else78         {79             printf("imp\n");80         }81     }82 83 84     return 0;85 }

AC如下:

 

The E-pang Palace