游客 Signup | Login
中文 | En

1542 - Problem B

请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。

Input

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

Output

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

Examples

Input

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

Output

159 145 144 135 81 60 44 32 28 27

Solution C

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp(const void *a,const void *b) {
        return *(int *)b-*(int *)a;
}

int main() {
        int a[32];
        int n,i,j,t;
        while(scanf("%d",&n)!=EOF) {
                memset(a,0,sizeof(a));
                for(i=0;i<n;i++) for(j=0;j<n;j++) {
                        scanf("%d",&t);
                        a[i]+=t;
                        a[j+n]+=t;
                        if (i==j) a[n+n]+=t;
                        if (i+j==n-1) a[n+n+1]+=t;
                }
                qsort(a,n+n+2,sizeof(a[0]),cmp);
                for(i=0;i<n+n+1;i++) printf("%d ",a[i]);
                printf("%d\n",a[i]);
        }
        return 0;
}

Solution C++

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp(const void *a,const void *b) {
	return *(int *)b-*(int *)a;
}

int main() {
	int a[32];
	int n,i,j,t;
	while(scanf("%d",&n)!=EOF) {
		memset(a,0,sizeof(a));
		for(i=0;i<n;i++) for(j=0;j<n;j++) {
			scanf("%d",&t);
			a[i]+=t;
			a[j+n]+=t;
			if (i==j) a[n+n]+=t;
			if (i+j==n-1) a[n+n+1]+=t;
		}
		qsort(a,n+n+2,sizeof(a[0]),cmp);
		for(i=0;i<n+n+1;i++) printf("%d ",a[i]);
		printf("%d\n",a[i]);
	}
	return 0;
}
Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题