id:15 C. 矩阵左转

题目描述

输入一个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 
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;
}

你可能感兴趣的:(数据结构做题总结,c语言,矩阵,算法)