题目描述
输入一个2*3的矩阵,将这个矩阵向左旋转90度后输出
比如现在有2*3矩阵 :
1 2 3
4 5 6
向左旋转90度后的矩阵变为:
3 6
2 5
1 4
要求:除了矩阵创建和数据输入可以使用数组和数组下标的方法,其他过程对矩阵的任何访问都必须使用指针
提示:m行n列的二维矩阵,第i行第j列的元素与首元素的距离为i*n+j,序号从0开始计算
输入
第一行输入t表示有t个测试实例
连续两行输入一个2*3的矩阵的数据
依次输入t个实例
输出
依次输出左转后的矩阵结果
在输出的每行中,每个数据之间都用空格隔开,最后一个数据后面也带有空格
输入样例
2
1 2 3
4 5 6
4 5 6
7 8 9
输出样例
3 6
2 5
1 4
6 9
5 8
4 7
题解
- 题目的提示是关键,找到输出的数字顺序与输出的数字的位置与首数字的距离关系即可
- 将数据输入进数组后,将指针指向数组的第一个元素
- 指针定义回顾,首先定义一个数组,输入值后,再定义一个指针,假设都是整数类型,此时需要给指针进行定义,假设我们是
int *p;
,此时的指针是需要指向一个整数,假设一个一维数组a,单单一个a表示的是指向数组的第一个元素,即指向一个整数,所以等同于一个整数类型的指针,所以指针可以指向a,因为类型相同,但是&a是指向整个数组的指针,所以指针p不能指向&a,因为类型不匹配,而&a[0]就更好理解,a[0]是数组的第一个元素,所以我们可以使用&a[0]来获取这个指针;再假设一个二维数组b,同理我们也要找到能指向二维数组第一个元素的有关b的指针,先但看一个b,由于数组是一个二维数组,所以单单一个b是一个指向包含 3 个int
元素的数组的指针,所以类型不匹配,而&a
是一个指向整个数组的指针,所以类型也不匹配,所以我们需要找到数组的第一个元素b[0][0],然后&b[0][0]即可获取这个指针 - 经过观察我们可以发现,矩阵左转后首先遍历原数组的行,在遍历数组的列,及两重循环,内层循环遍历行,外层循环遍历列,行从0开始遍历,每次加一,列从2开始遍历,每次减一
- 注意公式的列是3,所以公式是*3,因为p是指向数组的第一个元素,所以p加上要输出距离的值即可指向要输出的元素,直接输出,不用改变p指针
代码实现
#include <iostream>
using namespace std;
int main()
{
int i, t, a[2][3], j, k;
cin >> t;
for (i = 0; i < t; i++)
{
for (j = 0; j < 2; j++)
{
for (k = 0; k < 3; k++)
{
cin >> a[j][k];
}
}
int* p = &a[0][0];
// 先列后行
for (k = 2; k >= 0; k--)
{
for (j = 0; j < 2; j++)
{
cout << *(p + j * 3 + k) << " ";
}
cout << endl;
}
}
return 0;
}