int arr[2][3]={{1},{3}};
1 | 3 | 0 |
0 | 0 | 0 |
转置后:
1 | 0 | 0 |
3 | 0 | 0 |
int arr[4][4]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
1 | 0 | 0 |
3 | 0 | 0 |
转置后:
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
转置后:
0 | 4 | 8 | 12 |
1 | 5 | 9 | 13 |
2 | 6 | 10 | 14 |
3 | 7 | 11 | 15 |
集合两个例子会发现,转置问题实际上就是将arr[i][j]转置为arr[j][i]
编程实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//以例二为例子转置
int arr[4][4] = { {0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15} };
int i = 0;
int j = 0;
for (i=0; i < 4; i++)
{
for (j=0; j < 4; j++)
{
printf("%d ", arr[j][i]);
}
}
printf("\n");
return 0;
}
这是矩阵中比较简答的一类问题,只需要按照要求去输入输出即可
以牛客题为例;
矩阵元素定位_牛客题霸_牛客网
编程实现:
#include
//第一行包含两个数n和m,表示这个矩阵包含n行m列。
// 从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示矩阵中的元素。
// 接下来一行输入x和y,用空格分隔,表示KiKi想得到的元素的位置
#include
int main()
{
int n = 0;
int m = 0;//初始化
//输入
scanf("%d %d", &n, &m);
int arr[n][m];//变长数组不能初始化
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
//输入x,y
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
//输出
printf("%d", arr[x - 1][y - 1]);//注意数组与x,y对应关系
return 0;
}
00 | 01 | 02 | 03 | 04 | 05 |
10 | 11 | 12 | 13 | 14 | 15 |
20 | 21 | 22 | 23 | 24 | 25 |
30 | 31 | 32 | 33 | 34 | 35 |
40 | 41 | 42 | 43 | 44 | 45 |
50 | 51 | 52 | 53 | 54 | 55 |
如图转换后:
05 | 04 | 03 | 02 | 01 | 00 |
15 | 14 | 13 | 12 | 11 | 10 |
25 | 24 | 23 | 22 | 21 | 20 |
35 | 34 | 33 | 32 | 31 | 30 |
45 | 44 | 43 | 42 | 41 | 40 |
55 | 54 | 53 | 52 | 51 | 50 |
编程实现;
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//水平镜面转换
int arr[6][6] = { {00,01,02,03,04,05},{10,11,12,13,14,15},{20,21,22,23,24,25},{30,31,32,33,34,35},{40,41,42,43,44,45},{50,51,52,53,54,55} };
//输入
//转换
int i = 0;
int j = 0;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 3; j++)//注意j<3,取一半
{
int tmp = 0;
tmp=arr[i][j];
arr[i][j] = arr[i][6 - j-1];
arr[i][6 - j-1] = tmp;
}
}
//输出
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
我们不难发现,水平镜面转换即为arr[i][o]与arr[i][最后一个元素]转换
但要注意循环中j是小于一半(偶数),如果为奇数,则是总数先-1再/2;
借鉴水平镜面转换解题:
垂直镜面转换后;
50 | 51 | 52 | 53 | 54 | 55 |
40 | 41 | 42 | 43 | 44 | 45 |
30 | 31 | 32 | 33 | 34 | 35 |
20 | 21 | 22 | 23 | 24 | 25 |
10 | 11 | 12 | 13 | 14 | 15 |
00 | 01 | 02 | 03 | 04 | 05 |
编程实现;
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//垂直镜面转换
int arr[6][6] = { {00,01,02,03,04,05},{10,11,12,13,14,15},{20,21,22,23,24,25},{30,31,32,33,34,35},{40,41,42,43,44,45},{50,51,52,53,54,55} };
//输入
//转换
int i = 0;
int j = 0;
for (j = 0; j < 6; j++)
{
for (i = 0; i < 3; i++)//注意i<3,取一半
{
int tmp = 0;
tmp=arr[i][j];
arr[i][j] = arr[6-1-i][j];
arr[6-1-i][j] = tmp;
}
}
//输出
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
printf("%-3d ", arr[i][j]);//-3d左对齐
}
printf("\n");
}
return 0;
}
读者可以试试先水平镜面转换,再垂直镜面转换!!!
此类题较为简单,只需要按照要求输入输出即可
序列重组矩阵_牛客题霸_牛客网(以此题为例)
法一:利用数组求解
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//输入两个整数n和m,用空格分隔,第二行包含n*m个整数
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
int i = 0;
int j = 0;
int arr[n][m];//不能初始化
for (i = 0; i < n ; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr[i][j]);
}
}
//打印
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
法二;(由于VS2022无法用变长数组,因此,我们再来个不用数组的解法)
此法比法一简单
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int n = 0;
int m = 0;
//输入n,m
scanf("%d %d", &n, &m);
int i = 0;
int j = 0;
//输入n*m个数
for (i = 0; i < (n * m); i++)
{
scanf("%d", &j);
printf("%d ", j);
if (i % m == 0)
{
printf("\n");
}
}
return 0;
}
该类题只需要判断两个数组是否每个元素都相等即可!!
以牛客题为例:
矩阵相等判定_牛客题霸_牛客网
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
//第一行包含两个整数n和m,表示两个矩阵包含n行m列
int n = 0;
int m = 0;
scanf("%d %d", &n, &m);
//从2到n + 1行,每行输入m个整数,用空格分隔,共输入n * m个数,表示第一个矩阵中的元素。
//从n + 2行到2n + 1,每行输入m个整数,用空格分隔,共输入n * m个数,表示第二个矩阵中的元素
int arr1[n][m];
int arr2[n][m];
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr1[i][j]);
}
printf("\n");
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &arr2[i][j]);
}
printf("\n");
}
//输出,一行,如果两个矩阵相等输出"Yes"并换行,否则输出"No"并换行
int flag = 1;//假设相等
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (arr1[i][j]!= arr2[i][j])
{
flag = 0;
break;
}
}
}
if (0 == flag)
{
printf("No\n");
}
if (1 == flag)
{
printf("Yes\n");
}
return 0;
}
最后:学习路上加油!!!喜欢给个三连呗!!!跪求了!!!(一周之内会出第二部分,比第一部分可能难点,加油,不放弃)