算法笔记练习 4.1 排序 问题 E: Problem B

算法笔记练习 题解合集

题目链接

题目

题目描述
请写一个程序,对于一个m行m列的(1

输入
共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。

输出
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。

样例输入
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69

样例输出
159 145 144 135 81 60 44 32 28 27

思路

  1. 用二维数组接收矩阵
  2. 定义一个长度为 2*m+1 的 answer 数组
  3. 分别对每行、每列、两条对角线求和,将结果放入 answer
  4. 对 answer 排序并输出

代码

#include 
#include 
// qsort 排序函数
int cmpInt(const void *ca, const void *cb); 
int main(){
	int m, i, j;
	while (scanf("%d", &m) != EOF){
		int square[m][m];
		int answer[2 * m + 2];
		for (i = 0; i < m; ++i)
			for (j = 0; j < m; ++j)
				scanf("%d", &square[i][j]);
		int sum = 0;
		int *pans = answer;
		// 对每一列求和并写入 answer
		for (i = 0; i < m; ++i){
			for (j = 0; j < m; ++j)
				sum += square[i][j];
			*pans++ = sum;
			sum = 0;
		}
		// 对每一行求和并写入 answer
		for (i = 0; i < m; ++i){
			for (j = 0; j < m; ++j)
				sum += square[j][i];
			*pans++ = sum;
			sum = 0;
		}
		// 对正对角线求和并写入 answer
		for (i = 0; i < m; ++i)
			sum += square[i][i];
		*pans++ = sum;
		sum = 0;
		// 对副对角线求和并写入 answer
		for (i = 0; i < m; ++i)
			sum += square[i][m-i-1];
		*pans++ = sum;
		sum = 0;
		// 排序,输出
		qsort(answer, 2 * m + 2, sizeof(int), cmpInt);
		for (i = 0; i < 2 * m + 2; ++i)
			printf("%d ", answer[i]);
		putchar('\n'); 
	} 
	return 0;
} 

int cmpInt(const void *ca, const void *cb){
	int ret = 0;
	int a = *(int*)ca;
	int b = *(int*)cb;
	if (a > b)
		ret = -1;
	else if (a < b)
		ret = 1;
	return ret; 
} 

你可能感兴趣的:(算法笔记)