题目: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 Rect 14 { 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 ", sum); 76 } 77 else 78 { 79 printf("imp "); 80 } 81 } 82 83 84 return 0; 85 }
AC如下: