北邮复试_2010_矩阵旋转

题目描述

首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。 操作类型有四种: 1 2 表示:90度,顺时针,翻转4个数 1 3 表示:90度,顺时针,翻转9个数 2 2 表示:90度,逆时针,翻转4个数 2 3 表示:90度,逆时针,翻转9个数

分析:考查矩阵的旋转可以考虑一层层的进行置换,每一层四个边的数据进行交换
参考思路:https://blog.csdn.net/qq_31851531/article/details/96858119

   void rotate(vector<vector<int>>& nums, int ax, int bx, int ay, int by, bool forward)
    {
        int lap = (bx - ax + 1)%2+(bx-ax+1)/2;
        int temp;
        if (forward)                                                //顺时针
        {
            for (int i = 0; i < lap; i++)
            {          
                temp = nums[ax][ay+i];
                nums[ax][ay + i] = nums[bx - i][ay];
                nums[bx - i][ay] = nums[bx][by-i];
                nums[bx][by-i] = nums[ax + i][by];
                nums[ax + i][by] = temp;
            }
        }
        else
        {
            for (int i = 0; i < lap; i++)
            {
                temp = nums[ax][by - i];
                nums[ax][by - i] = nums[bx - i][by];
                nums[bx - i][by] = nums[bx][ay+i];
                nums[bx][ay + i] = nums[ax + i][ay];
                nums[ax + i][ay] = temp;
            }
        }      
    }
    void round()
    {
        vector<vector<int>> nums;
        vector<int> temp;
        int t;
        for (int i = 0; i < 5; i++)
        {
            temp.clear();
            for (int j = 0; j < 5; j++)
            {
                cin >> t;
                temp.push_back(t);
            }
            nums.push_back(temp);
        }
        int sx, sy, op1, op2;
        cin >> op1;
        cin >> op2;
        cin >> sx; sx--;
        cin >> sy; sy--;
        int num2 = 2, num3 = 3;
        if (op1 == 1 && op2 == 2)
        {
            rotate(nums, sx, sx + num2 - 1, sy, sy + num2 - 1, true);
        }
        else if (op1 == 1 && op2 == 3)
        {
            rotate(nums, sx, sx + num3 - 1, sy, sy + num3 - 1, true);
        }
        else if (op1 == 2 && op2 == 2)
        {
            rotate(nums, sx, sx + num2 - 1, sy, sy + num2 - 1, false);
        }
        else
        {
            rotate(nums, sx, sx + num3 - 1, sy, sy + num3 - 1, false);
        }
        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j< 5; j++)
            {
                cout << nums[i][j] << " ";
            }
            cout << endl;
        }
    }
发布了63 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/luncy_yuan/article/details/104334294