POJ 1046 Color Me Less(水题)

题意:先输入16种色彩,称之为集合A,然后再输入N种色彩,这些色彩为集合B,遇到色彩为输入为-1,-1,-1时,结束输入。然后,要求从B到A有个映射,这个映射的距离最短,即为下面的公式的值最小

POJ <wbr>1046 <wbr>Color <wbr>Me <wbr>Less(水题)

然后,按照标准格式输出。

分析:思路就是想用一个数组将B集合到A集合的映射的所有距离全部存起来,然后按照从小到大的顺序排序。当然,要先用另外一个数组保存一下原始的数组,用于后续的判断。注意题目中的一句话If there are more than one color with the same smallest distance, please output the color given first in the color set.如果有多个同样的距离,按照顺序输出第一个就好。所以在输出的过程中要注意循环的终止。

做这种题目思路多是如此。

第一次就是忘了写个break,WA了一次

 

贴下代码:(204k,0ms)

 

C++语言:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int a [ 16 ][ 3 ];
    int b [ 100 ][ 3 ] = { 0 };
    double d [ 100 ][ 16 ];     //两个颜色的距离
    double original_d [ 100 ][ 16 ];
    int distance = 0;
    int max;
    int i , j , k;
    int temp;
    for( i = 0; i < 16 ; i ++)
    {
        for( j = 0; j < 3; j ++)
        {
            cin >> a [ i ][ j ];
        }
    }
    for( i = 0; i < 100; i ++)
    {
        temp = 0;
        for( j = 0; j < 3; j ++)
        {
            cin >>b [ i ][ j ];
            if(b [ i ][ j ] == - 1)
                temp ++;
        }
        if( temp == 3)
        {
            max = i;
            break;
        }
    }

    for( i = 0 ; i < max; i ++)
        for( j = 0; j < 16; j ++)       //j是16个数据中的第j+1个数据
        {
            distance = 0;
            for( k = 0; k < 3; k ++)
                distance += (b [ i ][ k ] - a [ j ][ k ]) *(b [ i ][ k ] - a [ j ][ k ]);
            d [ i ][ j ] = sqrt(( double) distance);
            original_d [ i ][ j ] = d [ i ][ j ];
        }
        for( i = 0; i < max ; i ++)
        {
            sort( d [ i ], d [ i ] + 16);
        }

        for( i = 0; i < max; i ++)
            for( k = 0; k < 16; k ++)
            {
                if( original_d [ i ][ k ] == d [ i ][ 0 ])
                //    cout<<k<<endl;
                {
                    cout << "(" <<b [ i ][ 0 ] << "," <<b [ i ][ 1 ] << "," <<b [ i ][ 2 ] << ")" << " maps to " << "(" << a [ k ][ 0 ] << "," << a [ k ][ 1 ] << "," << a [ k ][ 2 ] << ")" << endl;
                    break;
                }
            }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值