菜鸟寒假培训悲惨经历
第一天
这是我第一次以博客的形式记录我的学习经历,这次培训的开始,还要追溯到那个愉快的上午… …
(然后就进入了题目)
👉二维矩阵对角线和
Description
计算m×m的方阵的对角线所有元素的和。
Input
输入数据有多组,每组第1行为m( 2<=m<=10),接下来有m行m列的数据1<=a(i,j)<=100;
Output
对于你刚输入的这个矩阵,输出方阵的对角线所有元素的和。
(交叉位置元素要多次计算的)
Sample Input
3
1 2 3
4 5 6
7 8 9
Sample Output
30
Hint
交叉位置元素要多次计算的
通过读题,嗯,这是一道二维数组题,那么,设二维数组就完了:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,i,j,x,y,n;
int a[100][100];
while(scanf("%d",&m)!=-1)
{
for(i=1; i<=m; i++)
{
for(j=1; j<=m; j++)
{
scanf("%d",&a[i][j]);
}
}
x=0;
y=0;
for(n=1; n<=m; n++)
{
x=x+a[n][n];
}
for(n=1; n<=m; n++)
{
y=y+a[n][m-n+1];
}
printf("%d\n",x+y);
}
return 0;
}
👉矩阵的外围
Description
在军事训练中,战士们站成一个方阵(也可能是一个长方形),每个战士身上都有1个
编号,现在军队领导想知道,站在队伍外围战士们的编号之和是多少?聪明的你能帮
帮他吗?
Input
输入数据有多组,每组第一行n和m(1<n,m<=10),代表行数和列数。接下来是n行m列个
战士的编号值value[i],0<= value[i] <=100;
Output
在一行内输出外围战士的编号之和。
Sample Input
3 3
1 2 3
4 5 6
0 1 0
Sample Output
17
这道题,设二维数组就完了:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m,i,j;
int a[100][100],x;
while(scanf("%d%d",&n,&m)!=-1)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
x=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(i==n||j==m||i==1||j==1)
{
x=x+a[i][j];
}
}
}
printf("%d\n",x);
}
return 0;
}
👉五人帮
Description
5人帮的含义就是数字和该数字所对应的上、下、左、右和自己本身的数值之和,请求出矩阵中5人帮的
最大值是多少?
Input
输入数据只有多组,每组第1行为2个数m和n(1 <m,n<10),代表行数和列数; 接下来输入这m行和n列
个数data(i,j)(1< data(i,j)<100)
Output
输出该矩阵5人帮的最大值!
Sample Input
3 4
1 2 3 4
3 4 5 6
2 3 3 9
Sample Output
24
这个题有一个奇怪的地方,就是这个矩阵之外的数字,这道题默认为0了,因此在矩阵外层的书也是可以作为五人帮的中心的,因此这道题的解法有:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n,max,sum;
int i,j;
int a[100][100];
while(scanf("%d%d",&m,&n)!=EOF)
{
maxx=0;
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
scanf("%d",&a[i][j]);
}
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
sum=a[i][j]+a[i][j-1]+a[i][j+1]+a[i-1][j]+a[i+1][j];
if(sum>max)
max=sum;
}
}
printf("%d\n",max);
}
return 0;
}
👉回转小矩阵
Description
现在有一个n*m行的矩阵A 逆时针旋转90度形成一个新的矩阵B,将B矩阵输出来。
Input
多组样例,每行两个整数n,m( 1<=n<=100, 1<=m<=100 )
Output
输出矩阵B
Sample Input
3 5
1 2 3 4 5
2 4 9 2 1
3 4 5 7 9
Sample Output
5 1 9
4 2 7
3 9 5
2 4 4
1 2 3
这个题可以从后往前输出,因此:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[10][10],tmp,max=0;
while(scanf("%d %d",&m,&n)!=-1)
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<m;j++)
{
printf("%d",a[j][i]);
if(j!=m-1)
cout<<" ";
}
cout<<endl;
}
}
return 0;
}
👉矩阵相乘
Description
计算2个方阵的乘积!
Input
输入数据有多组,每组第1行为m (1 <m<10),表示方阵的大小,接下来为2个m行m列
的数据data(i,j);( 1<data(i,j)<100)
Output
输出这2个方阵的乘积,具体见样例
Sample Input
2
1 2
1 2
3 1
1 3
Sample Output
5 7
5 7
这个题,干就完事儿了:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,a[10][10],b[10][10],c[10][10],tmp,sum;
while(scanf("%d",&m)!=-1)
{
sum=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
cin>>b[i][j];
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
c[i][j]=0;
for(int k=0;k<m;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
cout<<c[i][j];
if(j!=m-1)cout<<" ";
}
cout<<endl;
}
}
return 0;
}
所以,我们遇到什么困难,也不要怕,微笑着面对它,消除恐惧的最好办法就是面对恐惧,坚持,才是胜利,加油,奥利给!
此时,下集还在赶来的路上… …
(鄙人第一次尝试,若有不足之处还望指正,不喜勿喷💔)