描述
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入
第一行为整数k,表示有k组数据。
每组数据有多行组成,表示一个矩阵:
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以空格分隔。
接下来输入的m行数据中,每行包含n个整数,整数之间以空格作为间隔。
输出
输出对应矩阵的边缘元素和,一个一行。
样例输入
2
4 4
1 1 1 1
0 0 0 0
1 0 1 0
0 0 0 0
3 3
3 4 1
3 7 1
2 0 1
样例输出
5
15
这周的主题是指针
先写了一个没有使用指针的程序
#include<iostream> using namespace std; int main() { int k=0; cin >> k;//输入的数据组数 for (int i = 0; i < k; i++) { int m , n; cin >> m >> n;//矩阵的大小 int a[100][100];//存放数据的数组 int sum = 0;//计算的和 //输入数据 for (int j = 0; j < m; j++) for (int d = 0; d < n; d++) cin >> a[j][d]; //计算和 for (int j = 0; j < m; j++) { //第一行和最后一行所有数据相加 if (j == 0 || j == m - 1) { for (int d = 0; d < n; d++) sum = sum + a[j][d]; } //其余行只加第一个和最后一个 else sum = sum + a[j][0] + a[j][n - 1]; } cout << sum << endl; } return 0; }
使用指针的程序(仅仅是用指针表达了二维数组,不知道题目的是不是这个意思,还是如果利用指针可以有更好的解法)
#include<iostream> using namespace std; int main() { int k=0; cin >> k;//输入的数据组数 int sum[100] = { 0 };//边缘和 for (int i = 0; i < k; i++) { int m , n; cin >> m >> n;//矩阵的大小 int a[100][100];//存放数据的数组 int(*p)[100];//定义一个指向“包含100个int型元素的一维数组”的指针 p = a;//此时p指向的是数组a[0]的首地址 //输入数据 for (int j = 0; j < m; j++) { for (int d = 0; d < n; d++) cin >> *(*(p + j) + d); //*(p+j)是相当于a[j],*((p+j)+d)相当于a[j][d] } //计算和 //第一行和最后一行的元素全部相加 //其余行的元素只加第一个和最后一个 for (int j = 0; j < m; j++) { if (j == 0 || j == m - 1) { for (int d = 0; d < n; d++) sum[i] = sum[i] + *(*(p + j) + d); } else sum[i] = sum[i] + *(*(p + j)) + *(*(p + j) + n - 1); } } for (int i = 0; i < k; i++) cout << sum[i] << endl; return 0; }
之前第二周的最后一题匹配括号没有做出来于是就放着,以后有想法了再去解。