目录
1、矩阵的定义(n个长度为m的数组)
矩阵An×m 的定义是按照长方阵列排列的复数或实数集合,其中 n 代表行数, m 代表列数。在C语言中,我们可以用A[n][m]
来代表一个 n×m 的矩阵,其中A[i][j]
代表矩阵第 i 行,第 j 列的值。
int n,m;
cin>>n>>m;
int a[n][m];
2、矩阵的水平翻转
矩阵的水平翻转,就是将矩阵的每一行的元素进行逆序。
for(int i=n-1;i>=0;i--){
for(int j=0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
3、矩阵的垂直翻转
矩阵的垂直翻转,就是将矩阵的每一列的元素进行逆序。
for(int i=0;i<n;i++){
for(int j=m-1;j>=0;j--){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
4、矩阵的顺时针旋转
矩阵的顺时针旋转 90 度,顾名思义,就是绕着垂直屏幕向里的方向,对矩阵进行 90度旋转,这时候行列会交换。
for(int i=0;i<m;i++){
for(int j=n-1;j>=0;j--){
cout<<a[j][i]<<" ";
}
cout<<endl;
}
5、矩阵的逆时针旋转
矩阵的逆时针旋转 90 度,我们可以理解成 顺时针旋转 270 度,所以就是做 3 次顺时针旋转 90 度的操作。
for(int i=m-1;i>=0;i--){
for(int j=0;j<n;j++){
cout<<a[j][i]<<" ";
}
cout<<endl;
}
6、矩阵的转置
矩阵的转置,就是对矩阵的主对角线对称的元素进行交换的操作。也可以理解为行与列进行交换。
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cout<<a[j][i]<<" ";
}
cout<<endl;
}
7、二维数组
C语言中,二维数组可以用来描述矩阵,定义如下(3 行 4 列):
int a[3][4];
我们也可以将二维数组的元素进行初始化,如下:
int a[3][4] = {
{5, 2, 0, 4},
{1, 3, 1, 7},
{4, 0, 0, 9},
};
由于编译器能够通过后面的初始化列表知道到底有多少个数据元素,所以第一个中括号中的数字可以省略(但是第二个不能省略),如下:
int a[][4] = {
{5, 2, 0, 4},
{1, 3, 1, 7},
{4, 0, 0, 9},
};
当然,我们还可以定义一个大数组,但是只初始化其中几行元素:
int a[100][4] = {
{5, 2, 0, 4},
{1, 3, 1, 7},
{4, 0, 0, 9},
};
本质上,你可以把二维数组理解成一个一维数组。只不过一维数组的每一个元素,也是一个一维数组。
8、二维数组的索引
C语言中数组下标从 0 开始,那么,如果要取得数组a
的 i行 j 列的元素,可以通过a[i][j]
进行获取。
9、二维数组的函数传参
如果你已经了解了一维数组的传参,那么大概应该能猜出二维数组的传参。
回顾一下一维数组的传参,用的是一个*
,如下:
int add(int *nums, int numsSize) {
// ...
}
那么二维数组的传参,用的就是两个*(
二维指针),如下:
int diagonalSum(int** mat, int matSize, int* matColSize){
}
其中matSize
代表二维数组第一维的大小,也就是可以理解成有多少行;int* matColSize
是一个一维数组,代表每一行有多少列,即matColSize[0]
代表第 0 行有matColSize[0]
列,matColSize[1]
代表第 1 行有matColSize[1]
列,matColSize[i]
代表第 ii 行有matColSize[i]
列,以此类推。
由于矩阵的每一列元素都是一样的,所以这类题目中,我们一般可以初始化怎么写:
int diagonalSum(int** mat, int matSize, int* matColSize){
r = matSize;
c = matColSize[0];
// TODO
}
这样写的好处是把变量命名简单化,后续使用的时候不容易出错,让代码更加易读。
10、矩阵乘法
在我的另一个文章:
https://blog.csdn.net/weixin_63033110/article/details/134001927?spm=1001.2014.3001.5502
力扣463. 岛屿的周长
给定一个 row x col
的二维网格地图 grid
,其中:grid[i][j] = 1
表示陆地, grid[i][j] = 0
表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
使用c++代码实现:
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int grid[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>grid[i][j];
}
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]==1){
if(i==0||grid[i-1][j]==0)sum++;//对上面进行判断
if(i==n-1||grid[i+1][j]==0)sum++;//对下面进行判断
if(j==0||grid[i][j-1]==0)sum++;//对左面进行判断
if(j==m-1||grid[i][j+1]==0)sum++;//对右面进行判断
}
}
}
cout<<sum;
}