题目描述
平面上有一个矩形,大小为nxm,其中,长度为n的边是垂直的。长度为m的边是水平的,将矩形切割成nxm个小正方形,规定左上角的小正方形属性值为(1,1),左下角的小正方形属性值为(n,1),右上角的小正方形属性值为(1,m),右下角的小正方形属性值为(n,m),我们规定从上往下数第x行,从左往右数第y列的小正方形属性值为(x,y)。
现在,我们对这个矩形进行如下操作,将其顺时针旋转90度x次,然后将其水平翻转y次,然后将其逆时针旋转90度z次,接着,我们对这个操作后的矩形按原始的思路重新标上属性值,每一个小正方形就有一个原来的属性值和新的属性值,然后有Q个询问,每一次询问一个原来属性值为(x,y)的小正方形的新属性值,你需要对所有询问作出回答。
输入描述
输入第一行包含三个数x,y,z,代表顺时针旋转,水平翻转,逆时针旋转的次数。
接下来一行两个数,n,m代表原矩阵的大小。
接下来一行一个数,Q代表询问次数。
接下来Q行,每行两个数x,y代表一次询问,询问原矩形中属性值为(x,y)的小正方形现在的新属性值。
1<=x,y,z<=10^6;1<=n,m,Q<=1000;1<=x<=n;1<=y<=m;
输出描述
输出包含Q行,每一行一个答案。
示例:
1 1 1
4 5
3
1 1
3 4
2 5
样例输出:
4 1
2 4
3 5
#include <iostream>
//#include "math.h"
#include <cmath>
using namespace std;
struct node
{
int x;
int y;
};
int main()
{
int x1, y1, z1;
int n, m;
int Q;
cin >> x1 >> y1 >> z1;
cin >> n >> m;
cin >> Q;
int tempX = m / 2;
int tempY = n / 2;
// 查询若干次
for (int i = 0; i < Q; i++)
{
int x0 = 0, y0 = 0;
cin >> x0 >> y0;
// 判断旋转时针方向
// 逆时针
if (z1 > x1)
{
// 次数
int temp = z1 - x1;
// 旋转后的坐标
for (int j = 0; j < temp; j++)
{
x0 = (x0 - tempX) * cos(1 / 2) - (y0 - tempY) * sin(1 / 2) + tempX;
y0 = (x0 - tempX) * sin(1 / 2) + (y0 - tempY) * cos(1 / 2) + tempY;
}
// 反转
if (y1 % 2 == 0)
{
cout << x0 << "---------" << y0 << endl;
}
else if (y1 % 2 == 1)
{
x0 = (x0 - m) > 0 ? x0 - m : m - x0;
cout << x0 << "---------" << y0 << endl;
}
}
// 顺时针
else if (z1 < x1)
{
int temp = x1 - z1;
// 旋转后的坐标
for (int j = 0; j < temp; j++)
{
x0 = (x0 - tempX) * cos(1 / 2) - (y0 - tempY) * sin(1 / 2) + tempX;
y0 = -(x0 - tempX) * sin(1 / 2) + (y0 - tempY) * cos(1 / 2) + tempY;
}
// 反转
if (y1 % 2 == 0)
{
cout << x0 << "---------" << y0 << endl;
}
else if (y1 % 2 == 1)
{
x0 = (x0 - m) > 0 ? x0 - m : m - x0;
cout << x0 << "---------" << y0 << endl;
}
}
// 不旋转
else {
// 反转
if (y1 % 2 == 0)
{
cout << x0 << "---------" << y0 << endl;
}
else if (y1 % 2 == 1)
{
x0 = (x0 - m) > 0 ? x0 - m : m - x0;
cout << x0 << "---------" << y0 << endl;
}
}
}
return 0;
}
结果如下: