题目描述
首先输入一个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;
}
}