三级排序

三级排序
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 363 Accepted: 177

Description

给你三维坐标(x, y, z),请给三维坐标排序,优先按x值从小到大排序,当x值一样时,按y值从小到大排序,当y值一样时,按z值从小到大排序。

Input

输入数据的第一行是一个数据T,表示有T组数据。
对于每组数据先输入n (1 < n < 50000),表示有n个三维坐标,然后是n行,每行输入三个整数x, y, z。

Output

对于每组输入数据,先输出n,然后输出n行,为排序后的坐标。

Sample Input

2
2
1 2 3
3 2 1
4
2 3 4
2 2 3
2 3 2
3 4 1

Sample Output

2
1 2 3
3 2 1
4
2 2 3
2 3 2
2 3 4
3 4 1

【题目链接】微笑点点点微笑

【题目分析】
做这个题时我是通过分类中STL来找的,如果只想做出来可以定义二维数组来 做会好懂点,这里就不详细说明了,都应该会,下面接着我用STL做的分析吧,这 到题我最初用的string对象作为map元素来做的,后来通过提交和验证,发现竟然 不行,空格的ASCII竟然比数字的ASCII大,所以有不相等位的时候就会错,之后就 不知道怎么做了,不过看了一下书,想起了用map键值两变量来做,做了一半想起 输入时如果相同的x和y坐标相等不就覆盖了,试试定义三个吧,想到可以用映照数 据++来做,输出时用一个while()就可以了,谁知道这都可以这样一做加深了我对 map和重载字符的了解,还是很有收获的大笑

【代码实现】
#include<string>
#include<map>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Info
{
    int ax;
    int by;
    int cz;
    bool operator < (const Info &a) const       // 重载<运算符
    {
        if(a.ax!=ax)            // 比较x坐标
            return a.ax>ax;
        else if(a.by!=by)       // 如果x相等比较y坐标
            return a.by>by;
        else                    // 如果前面都相等比较z坐标
            return a.cz>cz;
    }
};
int main()
{
    string s;
    map<Info,int>m;   // 定义属于自己的容器
    int t;
    cin>>t;     // 输人t组数据
    while(t--)
    {
        int n,i,a,b,c;
        cin>>n;
        Info info;      // 定义结构体变量
        getchar();
        map<Info,int>::iterator it;
        for(i=0;i<n;i++)
        {
            cin>>a>>b>>c;   // 输出坐标
            info.ax=a;
            info.by=b;
            info.cz=c;
            m[info]++;      // 插入到map容器中
        }
        cout<<n<<endl;
        for(it=m.begin();it!=m.end();it++)
        {
            while((*it).second!=0)      // 如果输入的坐标重复,就多次输出
            {
                cout<<((*it).first).ax<<" "<<((*it).first).by<<" "<<((*it).first).cz<<endl;
                (*it).second--;
            }

        }
        m.clear();
    }
    return 0;
}
自己探索着,做出来的,有什么不对,或有更简单的方法记得告诉我。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值