我一次性AC这道题,用时30分钟。一开始是横着遍历,没做出来。后来改成竖着遍历,就做出来了。
#include<iostream>
#include<iomanip>
using namespace std;
double m[12][12];
int main()
{
//freopen("xxx.in","r",stdin);
//freopen("yyy.out","w",stdout);
char a;
cin >> a;
for(int i=0;i<12;i++)
{
for(int j=0;j<12;j++)
{
cin >> m[i][j];
}
}
double he=0;
int js;
int qsz=2;
for(int i=0;i<5;i++)
{
for(int j=qsz/2;j<=11-(qsz/2);j++)
{
he+=m[j][i];
js++;
}
qsz+=2;
}
if(a=='S')
{
cout << fixed << setprecision(1) << he << '\n';
}
else
{
cout << fixed << setprecision(1) << (he/js) << '\n';
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
然后,我又学了一个新的方法,叫行号列号的规律。规律是:左下三角是行号大于列号,右上三角是列号大于行号,左上三角是i+j小于N-1,也就是12-1,右下三角是i+j大于N-1,也就是12-1。
#include<iostream>
#include<iomanip>
using namespace std;
const int N=12;
double a[N][N];
int main()
{
// freopen("xxx.in","r",stdin);
// freopen("yyy.out","w",stdout);
char b;
int xs=0;
double he=0;
cin >> b;
for(int i=0;i<12;i++)
{
for(int j=0;j<12;j++)
{
cin >> a[i][j];
if(i>j && (i+j)<N-1)
{
he+=a[i][j];
xs++;
}
}
}
if(b=='S')
{
cout << fixed << setprecision(1) << he << '\n';
}
else
{
cout << fixed << setprecision(1) << (he/xs) << '\n';
}
// fclose(stdin);
// fclose(stdout);
return 0;
}