uva10112 Myacm Triangles

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#define LOCAL

typedef struct Point
{
    char label;
    int x;
    int y;
}point;

point Points[20];
int search[500][3];
int c;
int temp[3];
int visited[30];


void dfs(int pos, int n);
double area(point a, point b, point c);
int inside_triangle(point a, point b, point c, point d);
int cross(point a, point b, point c);

int main()
{
    int tests;
    int i, j;
    point triangle[3];
    int nodeVis[20];
    double s ;
    int ok;
    double temp;
    char ans[3];


    #ifdef LOCAL
        freopen("c://uva_in.txt", "r", stdin);
    #endif

    while (scanf("%d", &tests) && tests != 0)
    {
        c = 0;
        s = -1.0;
        memset(visited, 0, sizeof(visited));
        dfs(0, tests);

        fgetc(stdin);
        for (i = 1; i <= tests; i++)
        {
            scanf("%c%d%d", &(Points[i].label), &(Points[i].x), &(Points[i].y));
            fgetc(stdin);
        }

        for (i = 0; i < c; i++)
        {
            memset(nodeVis, 0, sizeof(nodeVis));
            for (j = 0; j < 3; j++)
            {
                nodeVis[search[i][j]] =1;
                triangle[j].label = Points[search[i][j]].label;
                triangle[j].x = Points[search[i][j]].x;
                triangle[j].y = Points[search[i][j]].y;
            }

            ok = 1;
            for (j = 1; j <= tests; j++)
            {
                if (!nodeVis[j])
                {
                    if (inside_triangle(triangle[0], triangle[1], triangle[2], Points[j]))
                    {
                        ok = 0;
                        break;
                    }
                }
            }


            temp = area(triangle[0], triangle[1], triangle[2]);

            if (ok && (temp > s))
            {
                s = temp;
                ans[0] = triangle[0].label;
                ans[1] = triangle[1].label;
                ans[2] = triangle[2].label;

            }
        }

        for (i = 0; i < 3; i++)
            printf("%c", ans[i]);
        printf("/n");
    }
    return 0;
}

void dfs(int pos, int n)
{
    int i;

    if (pos == 3)
    {
        search[c][0] = temp[0];
        search[c][1] = temp[1];
        search[c][2] = temp[2];
        c++;
    } else
    {
        for (i = 1; i <= n; i++)
        {
            if (!visited[i] && (i > temp[pos - 1]))
            {
                visited[i] = 1;
                temp[pos] = i;
                dfs(pos + 1, n);
                visited[i] = 0;
            }
        }
    }
}

double area(point a, point b, point c)
{
    int x1, y1, x2, y2;
    double s;

    x1 = b.x - a.x;
    y1 = b.y - a.y;

    x2 = c.x - a.x;
    y2 = c.y - a.y;

    s =  fabs(x1 * y2 - y1 * x2) / 2.0;

    return s;
}

int inside_triangle(point a, point b, point c, point d)
{
    if ((cross(a, b, d) >= 0 && cross(b, c, d) >= 0 && cross(c, a, d) >= 0) || (cross(a, b, d) <= 0 && cross(b, c, d) <= 0 && cross(c, a, d) <= 0))
        return 1;
    else
        return 0;
}

int cross(point a, point b, point c)
{
    int x1, y1, x2, y2;
    int temp;

    x1 = b.x - a.x;
    y1 = b.y - a.y;

    x2 = c.x - a.x;
    y2 = c.y - a.y;

    temp = x1 * y2 - x2 * y1;

    return temp;
}

你可能感兴趣的:(uva10112 Myacm Triangles)