当前位置: 代码迷 >> 综合 >> 1061. 二维数组排序
  详细解决方案

1061. 二维数组排序

热度:13   发布时间:2023-12-06 11:25:04.0

在这里插入图片描述
给定的模板:

#define M 100
//********** Specification of SortLines**********
void SortLines(int (*p)[M], int n, int m);
/* PreCondition: p points to a two-dimensional array with n lines and m integers in each line PostCondition: array is sorted satisfying to the specification *//***************************************************************/
/* */
/* DON'T MODIFY main function ANYWAY! */
/* */
/***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 100
#define N 100
//********** Specification of SortLines **********
void SortLines(int (*p)[M], int n, int m)
/* PreCondition: p points to a two-dimensional array with n lines and m integers in each line PostCondition: array is sorted satisfying to the specification */
{
       //TODO: your function definition
}
/***************************************************************/
int main()
{
    int a[N][M];int n,m,i,j;int t,cas;scanf("%d",&cas);for(t=0; t<cas; t++){
    memset(a,0,sizeof(a));scanf("%d%d",&n,&m);for (i=0; i<n; i++)for (j=0; j<m; j++)scanf("%d",&a[i][j]);/***** function SortLines is called here *****/SortLines(a,n,m);/****************************************/printf("case #%d:\n",t);for (i=0; i<n; i++)for (j=0; j<m; j++)printf("%d%c",a[i][j],j<m-1?' ':'\n');}return 0;
}

思路:
只要把核心的排序写在SortLines()函数里就可以了。
由于是边计算总和边交换的所以下一次比较时数组可能已经变了,所以每次都需要重新计算一下数组的和。同时因为题目要求升序,所以判断出来前面的数组大于后面数组时才需要进行操作。
代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 100
#define N 100
void exchange(int* a,int* b,int m)
{
    for (int i=0;i<m;i++){
    int t=b[i];b[i]=a[i];a[i]=t;}
}
void SortLines(int(*p)[M],int n,int m)
{
    for(int i=0;i<n-1;i++){
    for(int j=i+1;j<n;j++){
    long long sum1=0,sum2=0;for (int k=0;k<m;k++) sum1+=p[i][k];for (int k=0;k<m;k++) sum2+=p[j][k];if (sum1>sum2) exchange(p[i],p[j],m);if (sum1==sum2){
    int temp=0;while (p[i][temp]== p[j][temp]) temp++;if (p[i][temp]>p[j][temp]) exchange(p[i],p[j],m);}}}
}
int main()
{
    int a[N][M];int n,m,i,j;int t,cas;scanf("%d",&cas);for(t=0; t<cas; t++){
    memset(a,0,sizeof(a));scanf("%d%d",&n,&m);for (i=0; i<n; i++)for (j=0; j<m; j++)scanf("%d",&a[i][j]);/***** function SortLines is called here *****/SortLines(a,n,m);/****************************************/printf("case #%d:\n",t);for (i=0; i<n; i++)for (j=0; j<m; j++)printf("%d%c",a[i][j],j<m-1?' ':'\n');}return 0;
}