/* Fri Mar 19 14:35:18 JST 2004 */ /* Fri Mar 19 15:32:07 JST 2004 */ #include #include typedef struct { int x, y; } point_t; typedef struct { int x1, y1, x2, y2; } line_t; int h, c; line_t holev[51], holeh[51], coverv[51], coverh[51]; int nholev, nholeh, ncoverv, ncoverh; #define min(x,y) (((x)>(y))?(y):(x)) #define max(x,y) (((x)<(y))?(y):(x)) int inside(int x, int y, line_t v[51], int nv) { int i, c = 0; for (i = 0; i < nv; i++) { if (x == v[i].x1 && v[i].y1 <= y && y <= v[i].y2) { return 1; } if (x > v[i].x1 && v[i].y1 <= y && y <= v[i].y2) { c++; } } if (c % 2 == 0) { return 0; } return 1; } int main() { point_t hole[51], cover[51]; int icase, i, j, p, q, n, offsetx, offsety, minx, miny, yes; for (icase = 1; ; icase++) { scanf("%d%d", &h, &c); if (h == 0 && c == 0) { break; } minx = INT_MAX; miny = INT_MAX; for (i = 0; i < h; i++) { scanf("%d%d", &hole[i].x, &hole[i].y); if (minx > hole[i].x) { minx = hole[i].x; } if (miny > hole[i].y) { miny = hole[i].y; } } for (i = 0; i < h; i++) { hole[i].x -= minx; hole[i].y -= miny; } hole[h].x = hole[0].x; hole[h].y = hole[0].y; for (i = 0; i < c; i++) { scanf("%d%d", &cover[i].x, &cover[i].y); if (minx > cover[i].x) { minx = cover[i].x; } if (miny > cover[i].y) { miny = cover[i].y; } } for (i = 0; i < c; i++) { cover[i].x -= minx; cover[i].y -= miny; } cover[c].x = cover[0].x; cover[c].y = cover[0].y; nholev = nholeh = ncoverv = ncoverh = 0; for (i = 0; i < h; i++) { if (hole[i].x == hole[i+1].x) { /* vertical */ holev[nholev].x1 = holev[nholev].x2 = hole[i].x; holev[nholev].y1 = min(hole[i].y, hole[i+1].y); holev[nholev].y2 = max(hole[i].y, hole[i+1].y); nholev++; } else { holeh[nholeh].x1 = min(hole[i].x, hole[i+1].x); holeh[nholeh].x2 = max(hole[i].x, hole[i+1].x); holeh[nholeh].y1 = holeh[nholeh].y2 = hole[i].y; nholeh++; } } for (i = 0; i < c; i++) { if (cover[i].x == cover[i+1].x) { /* vertical */ coverv[ncoverv].x1 = coverv[ncoverv].x2 = cover[i].x; coverv[ncoverv].y1 = min(cover[i].y, cover[i+1].y); coverv[ncoverv].y2 = max(cover[i].y, cover[i+1].y); ncoverv++; } else { coverh[ncoverh].x1 = min(cover[i].x, cover[i+1].x); coverh[ncoverh].x2 = max(cover[i].x, cover[i+1].x); coverh[ncoverh].y1 = coverh[ncoverh].y2 = cover[i].y; ncoverh++; } } for (i = 0; i < nholev; i++) { for (j = 0; j < ncoverv; j++) { offsetx = holev[i].x1 - coverv[j].x1; for (p = 0; p < nholeh; p++) { for (q = 0; q < ncoverh; q++) { offsety = holeh[p].y1 - coverh[q].y1; yes = 1; for (n = 0; n < h; n++) { if (!inside(hole[n].x + offsetx, hole[n].y + offsety, coverv, ncoverv)) { yes = 0; break; } } if (yes) { goto quit; } } } } } quit: if (yes) { printf("Hole %d: Yes\n", icase); } else { printf("Hole %d: No\n", icase); } } return 0; }