猜猜谁是我

4 篇文章 0 订阅

Think:
很单纯的暴力算, 然后储存各脸的欧拉距离总和, 输出最小的即可。

PS:
欧拉距离 = 两点间距离 = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));

Problem Description
女神YSJ给Martin发了一个视频。“猜猜里面哪个是我。” 女神说。
作为一个脸盲,再加上多年不见,Martin已经完全不知道女神长成了什么样子,他表示完全认不出来。
好在Martin手上还有一张YSJ小时候的照片,他可以拿照片和视频里的人进行特征比对,从而找出女神。
为了简化问题,我们将YSJ小时候的脸表示成一个800行800列的矩阵,然后给出眼睛、鼻子、嘴巴的中心在脸上的坐标,全部用整数表示。视频中的其他人也都按照这个方式表示,截取正脸并且缩放到800x800以减小误差,输入不保证符合实际(例如不保证眼睛在鼻子的上方,鼻子在嘴巴上方blahblah。。)
Martin进行特征比对的方式相当简单粗暴:眼睛、鼻子、嘴巴中心和YSJ小时候照片的欧氏距离总和最小的就是女神。
YSJ小时候的脸部特征描述如下, 分别表示左眼、右眼、鼻子、嘴巴的中心在图中的位置(参见输入描述):
200 200
200 600
450 400
700 400

但是Martin的编程水平已经和他的表达能力一样烂到一定境界了,所以他希望聪明的你能够帮帮他。

Input
多组数据。每个人的人脸特征都用4行表示,每行两个整数x,y(0<=x,y<800) 分别表示左眼、右眼、鼻子、嘴巴的中心在图中的位置。。每一组数据先给出n (0< n<1000),表示视频中出现的脸的个数,编号从1-n,接着的n*4行给出每张脸的描述。

Output
对于每组数据,输出最可能是女神的脸的编号,如果有多张人脸符合要求,输出编号最小的,单独一行。

Sample Input

3
201 201
200 600
450 400
700 400
201 200
200 600
450 400
700 400
200 201
200 600
450 400
700 400

Sample Output

2

Hint
欧氏距离就是两个点的直线距离

#include<stdio.h>
#include<math.h>
struct node
{
  double LEX, LEY, REX, REY, NX, NY, MX, MY;
  int num;
  double len;

}a[1050], temp;

  int main()
   {
   int n;
   while(scanf("%d",&n)!=EOF)
   {
      int i, j;
      for (i = 0;i <= n - 1;i ++)
       {
         a[i].num = i + 1;
         scanf("%lf %lf",&a[i].LEX,&a[i].LEY);
         scanf("%lf %lf",&a[i].REX,&a[i].REY);
         scanf("%lf %lf",&a[i].NX,&a[i].NY);
         scanf("%lf %lf",&a[i].MX,&a[i].MY);

         double t1, t2, t3, t4;
         t1 = pow(a[i].LEX - 200, 2) + pow(a[i].LEY - 200, 2);
         t2 = pow(a[i].REX - 200, 2) + pow(a[i].REY - 600, 2);
         t3 = pow(a[i].NX - 450, 2) + pow(a[i].NY - 400, 2);
         t4 = pow(a[i].MX - 700, 2) + pow(a[i].MY - 400, 2);
         a[i].len = sqrt(t1) + sqrt(t2) + sqrt(t3) + sqrt(t4);
       }
       for (i = 0;i <= n - 2;i ++)
          {
             for (j = 0;j <= n - i - 2;j ++)
                {
                   if (a[j].len > a[j + 1].len)
                       {
                          temp = a[j];
                          a[j] = a[j + 1];
                          a[j + 1] = temp;
                       }
                    if (a[j].len == a[j + 1].len)
                       {
                          if (a[j].num > a[j + 1].num)
                             {
                              temp = a[j];
                          a[j] = a[j + 1];
                          a[j + 1] = temp;
                             }
                       }
                }
          }


      printf("%d\n",a[0].num);
   }
   return 0;
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值