ZZUOJ - 1245 - 寻找幸福的小L

郑州大学第八届ACM大学生程序设计竞赛正式赛
F.寻找幸福的小L

Description

小L最近看上了一个女同学叫小A,但是小A是个高冷的姑娘,所以她给小L出了个难题,她给小L留下了一张纸条,上面只有一个坐标,和一个时间,所以小L需要在规定时间找到这个坐标的地点,并在那个时间到哪个地点等待小A,但是很无奈,小L不是一个地理通,所以他找到了小A的室友,想知道一点信息,小A的室友就给了小L一共N个城市边角的坐标(假设每个城市都是一个M多边形),小L需要做的就是判断小A是不是在这个城市(在边上或在城市的顶点也算在城市中),所以小L就找到了神奇的ACMer,大家帮帮他找到他的小A吧

Input

测试数据有多组,你需要处理到文件结尾(EOF),每组的格式如下:

第一行为一个坐标X,Y 和两个数字N,M(-1000<=X,Y<=1000 ,1<=N<=100 ,3<=M<=100)
接下来N行每行有M个坐标(坐标将以逆时针的顺序给出,其中坐标都是整数)

Output

输出在第几个城市

Sample Input

5 5 2 4
2 0 4 0 4 4 2 4
2 0 6 0 6 6 2 6

Sample Output

2

HINT

题目保证一定存在答案,并且只会在一个城市中(即使城市有重叠)。而且给定的城市的多边形是凸多边形。

吼吼!郑州大学第九届ACM大学生程序设计竞赛要来了。嘿嘿,先做一遍去年的校赛的题。
一开始就是想如何判断一个点是不是在一个多边形中(不会啊/(ㄒoㄒ)/~~)。在网上找了一下有关的文章点这里哦
按照这种思路,我写了一下,结果老是WA(⊙﹏⊙b)。想了半天才发现,-1/0 = 0,稍微改了一下就对了 ~(≧▽≦)/~

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct node
{
    int x, y;
}coor[110];
int main()
{
    int x, y, n, m, i, j, k, t;
    bool flag;
    while(~scanf("%d%d%d%d", &x, &y, &n, &m))
    {
        flag = false;
        for(i = 0; i < n; i++) 
        {
            for (j = 0; j < m; j++)
            {
                scanf("%d%d", &coor[j].x, &coor[j].y);
            }
            if (!flag)
            {
                for (j = 0; j < m-1; j++)
                {
                    t = (coor[j].x - coor[j+1].x)*(coor[j].y+coor[j+1].y) + (coor[j+1].x - x)*(coor[j+1].y+y) + (x - coor[j].x)*(coor[j].y+y);
                    if (t < 0)
                    {
                        break;
                    }
                }
                if (j == m-1)
                {
                    t = (coor[j].x - coor[0].x)*(coor[j].y+coor[0].y) + (coor[0].x - x)*(coor[0].y+y) + (x - coor[j].x)*(coor[j].y+y);
                    if (t > 0)
                    {
                        printf("%d\n", i+1);
                        flag = true;
                    }
                }
            }
        }
    }
    return 0;
}

你可能感兴趣的:(ACM)