| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 692 人关注过本帖
标题:请教一道关于结构和排序的题(想用二维数组)
只看楼主 加入收藏
傥来
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2014-5-4
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
请教一道关于结构和排序的题(想用二维数组)
先po题目
//呃。。。居然不能po图 还是我不会。。

[b]题目:[/b]
Description

时值情人节,青羽送了一个百宝箱给小衣,大小为n×m,每个格子里都有一件物品,物品价值为vi。现在需要你将这些格子按照价值从大到小排序。价值相同行号小的在前,行号再相同时,则列号在前的优先。
Input
第一行输入两个整数n,m表示百宝箱的大小。
接着输入n行m列的数据,分别表示对应格子里的物品的价值。
Output
按照要求排序后,每行输出一个行号、一个列号以及该行列号表示的格子里的物品价值。
Sample Input
3 5
19 5 12 15 4
16 7 14 5 19
19 10 1 17 2
Sample Output
1 1 19
2 5 19
3 1 19
3 4 17
2 1 16
1 4 15
2 3 14
1 3 12
3 2 10
2 2 7
1 2 5
2 4 5
1 5 4
3 5 2
3 3 1
HINT
输出时,格子的行列数与日常生活的计数习惯一致,即从1开始。

我写的程序:

#include<stdio.h>
struct Thing
{
    int a,b,value; //构建结构体
};
int main()
{
    int m,n;
    Thing th[100][100],t;//定义一个 二维数组 去存放 某个物品,并且定义一个 暂存的空间;
    scanf("%d %d",&n,&m);//读入行列
    int i,j,p,q;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            scanf("%d",&th[i][j].value);//读入每个物体的价值
            th[i][j].a=i+1;//赋值 行
            th[i][j].b=j+1;//赋值 列
        }
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            for(p=i;p<n;p++)
                for(q=j;q<m;q++)
            if(th[i][j].value<th[p][q].value || th[i][j].value==th[p][q].value && th[i][j].a>th[p][q].a ||
                th[i][j].value==th[p][q].value && th[i][j].a==th[p][q].a && th[i][j].b>th[p][q].b)
            {
                t=th[i][j];th[i][j]=th[p][q];th[p][q]=th[i][j];//交换
            }
        }
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            printf("%d %d %d\n",th[i][j].a,th[i][j].b,th[i][j].value);//输出
        }
    return 0;
}



【在草纸上演算了几步 感觉算法对啊】
【c++上运行是ok的 但是出不来正确结果 一堆不明所以的东西】
【so...还是算法出错了吗?!
搜索更多相关主题的帖子: 百宝箱 情人节 格子 价值 
2014-05-06 21:51
傥来
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2014-5-4
收藏
得分:0 
发了几遍都没出来。。以为被吞了 。。

(*^__^*) 嘻嘻 还好出来了最后
2014-05-06 21:54
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:7 

    Thing th[100][100],t; //定义一个 二维数组 去存放 某个物品,并且定义一个 暂存的空间;
应该改为:   
struct Thing th[100][100],t;
其他还没看。
2014-05-07 10:15
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
你的算法有问题。
2014-05-07 10:26
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
用一维的方便的多。
程序代码:
//为了调试方便直接赋的值。
#include<stdio.h>
struct Thing
{
    int i,j,value; //构建结构体
};
int main()
{
    int m=3,n=5;
    struct Thing th[100],t;    //定义一个 数组 去存放 某个物品,并且定义一个 暂存的空间;
    int i,j,k=0,tt[15]={19, 5, 12, 15, 4,16, 7, 14, 5, 19,19, 10, 1, 17, 2};


    //scanf("%d %d",&n,&m);            //读入行列

    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
        {
            th[k].i=i;                    //赋值 行
            th[k].j=j;                    //赋值 列
            //scanf("%d",&th[k++].value);
            th[k].value=tt[k++];
        }
    k--;
    for(i=0;i<k;i++)
        for(j=0;j<k-i;j++)
        {
            if(th[j].value<th[j+1].value)
            {
                t=th[j];th[j]=th[j+1];th[j+1]=t;//交换
            }
        }
    for(i=0;i<=k;i++)
        {
            printf("%d %d %d\n",th[i].i,th[i].j,th[i].value);//输出
        }
    return 0;
}


2014-05-07 11:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:7 
若你用的是符合标准的C编译器
程序代码:
#include <stdio.h>
#include <stdlib.h>

struct node
{
    int row, col;
    int val;
};

int __cdecl compare_node( const void* a, const void* b )
{
    const struct node* a_ = (const struct node*)a;
    const struct node* b_ = (const struct node*)b;

    if( a_->val != b_->val )
        return b_->val - a_->val; // 价值大的在前

    if( a_->row != b_->row )
        return a_->row - b_->row; // 行号小的在前

    return a_->col - b_->col; // 列号小的在前
}

int main()
{
    // 输入
    int n, m;
    scanf( "%d%d", &n, &m );
    struct node* box = malloc( n*m*sizeof(box[0]) );
    for( int i=0; i!=n*m; ++i )
    {
        box[i].row = i/m;
        box[i].col = i%m;
        scanf( "%d", &box[i].val );
    }
    // 排序
    qsort( box, n*m, sizeof(box[0]), &compare_node );
    // 输出
    for( int i=0; i!=n*m; ++i )
        printf( "%d %d %d\n", box[i].row+1, box[i].col+1, box[i].val );

    free( box );

    return 0;
}

若用的是不符合标准的C编译器,或C++编译器
程序代码:
#include <stdio.h>
#include <stdlib.h>

struct node
{
    int row, col;
    int val;
};

int __cdecl compare_node( const void* a, const void* b )
{
    const struct node* a_ = (const struct node*)a;
    const struct node* b_ = (const struct node*)b;

    if( a_->val != b_->val )
        return b_->val - a_->val; // 价值大的在前

    if( a_->row != b_->row )
        return a_->row - b_->row; // 行号小的在前

    return a_->col - b_->col; // 列号小的在前
}

int main()
{
    // 输入
    int n, m, i;
    struct node* box;
    scanf( "%d%d", &n, &m );
    box = (struct node*)malloc( n*m*sizeof(box[0]) );
    for( i=0; i!=n*m; ++i )
    {
        box[i].row = i/m;
        box[i].col = i%m;
        scanf( "%d", &box[i].val );
    }
    // 排序
    qsort( box, n*m, sizeof(box[0]), &compare_node );
    // 输出
    for( i=0; i!=n*m; ++i )
        printf( "%d %d %d\n", box[i].row+1, box[i].col+1, box[i].val );

    free( box );

    return 0;
}

2014-05-07 12:26
longxingxiu
Rank: 2
等 级:论坛游民
帖 子:73
专家分:64
注 册:2014-4-23
收藏
得分:7 
回复 楼主 傥来
算法有问题
2014-05-08 00:36
快速回复:请教一道关于结构和排序的题(想用二维数组)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027771 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved