问题 E: Problem B
时间限制: 1 Sec 内存限制: 32 MB
请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。
输入
共一组数据,输入的第一行为一个正整数,表示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
提示:
因和值可能会重复,用multiset容器为宜,笔者因数组越界一直提交通不过,一位细心的小哥哥帮发现了,在此提出感谢,一般提交不过都在处理问题的逻辑上找原因,因这个疏忽这个简单的问题花了我好长时间,要认真反思,也希望读者不要犯类似的错误。
参考代码:
#include<iostream>
#include<set>
using namespace std;
class myCompare //重载 ()
{
public:
bool operator()( int v1 ,int v2)
{
return v1 > v2;
}
};
int main()
{
int i,j,m;
while(cin >> m)
{
multiset<int,myCompare> st;
int arr[10] [10] = {0};
int sum[m+1][2]={0};
for(i = 0; i < m; i++ )
{
for(j = 0; j < m; j++)
{
cin >> arr[i] [j];
sum[i][0] += arr[i] [j];
sum[j][1] += arr[i] [j];
}
sum[m][0] += arr[i][i];
sum[m][1] += arr[i][m-1-i];
}
for(i = 0; i <= m; ++i)
{
st.insert(sum[i][0]);
st.insert(sum[i][1]);
}
for (multiset<int,myCompare>::iterator it = st.begin(); it != st.end();++it)
{
cout << *it << " ";
}
cout << endl;
}
return 0;
}