zoukankan      html  css  js  c++  java
  • POJ 3449 Geometric Shapes

    POJ_3449

        这个题目由于图形很少,思路还是很直接的,暴力就可以了,枚举任意两个图形,并枚举两个图形间所有线段的位置关系,如果存在两条线段相交,那么这两个图形就是相交的。

        这个题的输入输出比较恶心,此外,对于正方形已知一对点求另一对点时可以用向量的旋转来求,首先求得正方形中心的坐标,然后将中心到两个点的连线看作两个向量,将这两个向量各旋转90度就可以得到中心到另外两个点的向量,进而就可以求得另外两个点的坐标了。向量的旋转可以参考矩阵运算中的一些内容:http://www.matrix67.com/blog/archives/276/

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define MAXD 30
    #define zero 1e-8
    char b[110];
    int N, name[MAXD], vn[MAXD], g[MAXD][MAXD], n[MAXD], vis[MAXD];
    double x[MAXD][MAXD], y[MAXD][MAXD];
    int cmp(const void *_p, const void *_q)
    {
    int *p = (int *)_p;
    int *q = (int *)_q;
    return *p - *q;
    }
    void input()
    {
    int i, j, k;
    name[N] = b[0];
    scanf("%s", b);
    if(strcmp(b, "square") == 0)
    {
    vn[N] = 4;
    scanf("%s", b);
    sscanf(b, "(%lf,%lf)", &x[N][0], &y[N][0]);
    scanf("%s", b);
    sscanf(b, "(%lf,%lf)", &x[N][2], &y[N][2]);
    double dx, dy, x0, y0;
    x0 = (x[N][0] + x[N][2]) / 2, y0 = (y[N][0] + y[N][2]) / 2;
    dx = x[N][0] - x0, dy = y[N][0] - y0;
    x[N][1] = x0 - dy, y[N][1] = y0 + dx;
    dx = x[N][2] - x0, dy = y[N][2] - y0;
    x[N][3] = x0 - dy, y[N][3] = y0 + dx;
    x[N][4] = x[N][0], y[N][4] = y[N][0];
    }
    else if(strcmp(b, "rectangle") == 0)
    {
    vn[N] = 4;
    for(i = 0; i < 3; i ++)
    {
    scanf("%s", b);
    sscanf(b, "(%lf,%lf)", &x[N][i], &y[N][i]);
    }
    x[N][3] = x[N][0] + (x[N][2] - x[N][1]), y[N][3] = y[N][0] + (y[N][2] - y[N][1]);
    x[N][4] = x[N][0], y[N][4] = y[N][0];
    }
    else if(strcmp(b, "line") == 0)
    {
    vn[N] = 1;
    for(i = 0; i < 2; i ++)
    {
    scanf("%s", b);
    sscanf(b, "(%lf,%lf)", &x[N][i], &y[N][i]);
    }
    }
    else if(strcmp(b, "triangle") == 0)
    {
    vn[N] = 3;
    for(i = 0; i < 3; i ++)
    {
    scanf("%s", b);
    sscanf(b, "(%lf,%lf)", &x[N][i], &y[N][i]);
    }
    x[N][3] = x[N][0], y[N][3] = y[N][0];
    }
    else
    {
    scanf("%d", &vn[N]);
    for(i = 0; i < vn[N]; i ++)
    {
    scanf("%s", b);
    sscanf(b, "(%lf,%lf)", &x[N][i], &y[N][i]);
    }
    x[N][vn[N]] = x[N][0], y[N][vn[N]] = y[N][0];
    }
    }
    int init()
    {
    int i, j, k;
    for(N = 0; ; N ++)
    {
    scanf("%s", b);
    if(b[0] == '.')
    return 0;
    if(b[0] == '-')
    break;
    input();
    }
    return 1;
    }
    double fabs(double x)
    {
    return x < 0 ? -x : x;
    }
    double dcmp(double x)
    {
    if(fabs(x) < zero)
    return 0;
    if(x < 0)
    return -1;
    return 1;
    }
    double det(double x1, double y1, double x2, double y2)
    {
    return x1 * y2 - x2 * y1;
    }
    int inseg(double x, double y, double x1, double y1, double x2, double y2)
    {
    if(fabs(x1 - x2) < fabs(y1 - y2))
    {
    if(dcmp((y1 - y) * (y2 - y)) <= 0)
    return 1;
    }
    else
    {
    if(dcmp((x1 - x) * (x2 - x)) <= 0)
    return 1;
    }
    return 0;
    }
    int check(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
    {
    double t1, t2, t3, t4;
    t1 = det(x2 - x1, y2 - y1, x3 - x1, y3 - y1);
    t2 = det(x2 - x1, y2 - y1, x4 - x1, y4 - y1);
    t3 = det(x4 - x3, y4 - y3, x1 - x3, y1 - y3);
    t4 = det(x4 - x3, y4 - y3, x2 - x3, y2 - y3);
    if(dcmp(t1) == 0 && inseg(x3, y3, x1, y1, x2, y2))
    return 1;
    if(dcmp(t2) == 0 && inseg(x4, y4, x1, y1, x2, y2))
    return 1;
    if(dcmp(t3) == 0 && inseg(x1, y1, x3, y3, x4, y4))
    return 1;
    if(dcmp(t4) == 0 && inseg(x2, y2, x3, y3, x4, y4))
    return 1;
    if(dcmp(t1) * dcmp(t2) < 0 && dcmp(t3) * dcmp(t4) < 0)
    return 1;
    return 0;
    }
    void calculate(int i, int j)
    {
    int p, q;
    for(p = 0; p < vn[i]; p ++)
    for(q = 0; q < vn[j]; q ++)
    if(check(x[i][p], y[i][p], x[i][p + 1], y[i][p + 1], x[j][q], y[j][q], x[j][q + 1], y[j][q + 1]))
    {
    g[i][n[i] ++] = name[j];
    g[j][n[j] ++] = name[i];
    return ;
    }
    }
    void printresult(int k)
    {
    int i, j;
    if(n[k] == 0)
    printf("%c has no intersections\n", name[k]);
    else if(n[k] == 1)
    printf("%c intersects with %c\n", name[k], g[k][0]);
    else if(n[k] == 2)
    printf("%c intersects with %c and %c\n", name[k], g[k][0], g[k][1]);
    else
    {
    printf("%c intersects with ", name[k]);
    for(j = 0; j < n[k] - 1; j ++)
    printf("%c, ", g[k][j]);
    printf("and %c\n", g[k][n[k] - 1]);
    }
    }
    void solve()
    {
    int i, j, k, t;
    memset(n, 0, sizeof(n));
    for(i = 0; i < N; i ++)
    for(j = i + 1; j < N; j ++)
    calculate(i, j);
    memset(vis, 0, sizeof(vis));
    for(i = 0; i < N; i ++)
    {
    t = 128;
    for(j = 0; j < N; j ++)
    if(!vis[j] && name[j] < t)
    k = j, t = name[j];
    vis[k] = 1;
    qsort(g[k], n[k], sizeof(g[k][0]), cmp);
    printresult(k);
    }
    }
    int main()
    {
    while(init())
    {
    solve();
    printf("\n");
    }
    return 0;
    }


  • 相关阅读:
    Fegin参数使用总结
    navicat彻底卸载
    VM虚拟机win10无法联网,DNS配置问题
    Navicat15的安装及破解
    Docker 配置国内镜像源拉取prometheus,解决prometheus拉取特别慢的问题
    python中faker(生成随机数据)
    初探移动网站的架构和设计
    利用HTML5的一个重要特性 —— DeviceOrientation来实现手机网站上的摇一摇功能
    响应式Web设计(三):响应式Web设计的方法
    响应式Web设计(四):响应式Web设计的优化
  • 原文地址:https://www.cnblogs.com/staginner/p/2348951.html
Copyright © 2011-2022 走看看