#include <stdio.h> #include <stdlib.h> #define min(x,y) ((x) < (y) ? (x) : (y)) #define max(x,y) ((x) < (y) ? (y) : (x)) #define MAKS_N 100000 struct pole { int x1; int x2; int y1; int y2; int lacz; }; typedef struct pole t_pole; t_pole pole[2][MAKS_N]; int porownaj(const void *e1, const void *e2) { t_pole *p1 = (t_pole *) e1; t_pole *p2 = (t_pole *) e2; int por = p1->x1 - p2->x1; if (por == 0) por = p1->x2 - p2->x2; if (por == 0) por = p1->y1 - p2->y1; if (por == 0) por = p1->y2 - p2->y2; return por; } int lacz_pola(int a, int b, int i, int j, int n2) { if (pole[a][i].x2 > pole[a][j].x1 && pole[a][i].y1 < pole[a][j].y2 && pole[a][i].y2 > pole[a][j].y1) { pole[b][n2].x1 = /*pole[a][i].x1 = */min(pole[a][i].x1, pole[a][j].x1); pole[b][n2].x2 = /*pole[a][i].x2 = */max(pole[a][i].x2, pole[a][j].x2); pole[b][n2].y1 = /*pole[a][i].y1 = */min(pole[a][i].y1, pole[a][j].y1); pole[b][n2].y2 = /*pole[a][i].y2 = */max(pole[a][i].y2, pole[a][j].y2); pole[b][n2].lacz = 0; pole[a][i].lacz = 1; pole[a][j].lacz = 1; // printf("\t%d\t%d\t%d\t%d\n", pole[b][n2].x1, pole[b][n2].x2, pole[b][n2].y1, pole[b][n2].y2); return 1; } else return 0; } int main() { int n, i, j, a, b, n2; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d%d%d%d", &pole[0][i].x1, &pole[0][i].x2, &pole[0][i].y1, &pole[0][i].y2); pole[0][i].lacz = 0; } a = 0; b = 1; do { qsort(pole[a], n, sizeof(t_pole), porownaj); n2 = 0; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n && pole[a][i].x2 > pole[a][j].x1 && n2 < MAKS_N; j++) if (lacz_pola(a, b, i, j, n2)) n2++; } if (n2 > 0) { for (i = 0; i < n; i++) { if (!pole[a][i].lacz) { pole[b][n2].x1 = pole[a][i].x1; pole[b][n2].x2 = pole[a][i].x2; pole[b][n2].y1 = pole[a][i].y1; pole[b][n2].y2 = pole[a][i].y2; pole[b][n2].lacz = 0; n2++; } } n = n2; } a = 1 - a; b = 1 - b; } while (n2 > 0); printf("%d\n", n); for (i = 0; i < n; i++) printf("%d %d %d %d\n", pole[b][i].x1, pole[b][i].x2, pole[b][i].y1, pole[b][i].y2); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <stdio.h> #include <stdlib.h> #define min(x,y) ((x) < (y) ? (x) : (y)) #define max(x,y) ((x) < (y) ? (y) : (x)) #define MAKS_N 100000 struct pole { int x1; int x2; int y1; int y2; int lacz; }; typedef struct pole t_pole; t_pole pole[2][MAKS_N]; int porownaj(const void *e1, const void *e2) { t_pole *p1 = (t_pole *) e1; t_pole *p2 = (t_pole *) e2; int por = p1->x1 - p2->x1; if (por == 0) por = p1->x2 - p2->x2; if (por == 0) por = p1->y1 - p2->y1; if (por == 0) por = p1->y2 - p2->y2; return por; } int lacz_pola(int a, int b, int i, int j, int n2) { if (pole[a][i].x2 > pole[a][j].x1 && pole[a][i].y1 < pole[a][j].y2 && pole[a][i].y2 > pole[a][j].y1) { pole[b][n2].x1 = /*pole[a][i].x1 = */min(pole[a][i].x1, pole[a][j].x1); pole[b][n2].x2 = /*pole[a][i].x2 = */max(pole[a][i].x2, pole[a][j].x2); pole[b][n2].y1 = /*pole[a][i].y1 = */min(pole[a][i].y1, pole[a][j].y1); pole[b][n2].y2 = /*pole[a][i].y2 = */max(pole[a][i].y2, pole[a][j].y2); pole[b][n2].lacz = 0; pole[a][i].lacz = 1; pole[a][j].lacz = 1; // printf("\t%d\t%d\t%d\t%d\n", pole[b][n2].x1, pole[b][n2].x2, pole[b][n2].y1, pole[b][n2].y2); return 1; } else return 0; } int main() { int n, i, j, a, b, n2; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d%d%d%d", &pole[0][i].x1, &pole[0][i].x2, &pole[0][i].y1, &pole[0][i].y2); pole[0][i].lacz = 0; } a = 0; b = 1; do { qsort(pole[a], n, sizeof(t_pole), porownaj); n2 = 0; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n && pole[a][i].x2 > pole[a][j].x1 && n2 < MAKS_N; j++) if (lacz_pola(a, b, i, j, n2)) n2++; } if (n2 > 0) { for (i = 0; i < n; i++) { if (!pole[a][i].lacz) { pole[b][n2].x1 = pole[a][i].x1; pole[b][n2].x2 = pole[a][i].x2; pole[b][n2].y1 = pole[a][i].y1; pole[b][n2].y2 = pole[a][i].y2; pole[b][n2].lacz = 0; n2++; } } n = n2; } a = 1 - a; b = 1 - b; } while (n2 > 0); printf("%d\n", n); for (i = 0; i < n; i++) printf("%d %d %d %d\n", pole[b][i].x1, pole[b][i].x2, pole[b][i].y1, pole[b][i].y2); return 0; } |