题目链接:Codeforces 400C Inna and Huge Candy Matrix
不是难题,需要耐心找规律。
记得某些翻转后需要交换行列值。
#include <iostream>
using namespace std;
const int MAX_N = 100000 + 1000;
struct Point
{
int x,y;
};
int n,m,x,y,z,p;
Point point[MAX_N];
void clockwise(int k)
{
k = k % 4;
if(k == 1)
{
for(int i = 0;i < p;i++)
{
int temp_x = point[i].x;
int temp_y = point[i].y;
point[i].x = temp_y;
point[i].y = n + 1 - temp_x;
}
int temp = n;
n = m;
m = temp;
}
else if(k == 2)
{
for(int i = 0;i < p;i++)
{
int temp_x = point[i].x;
int temp_y = point[i].y;
point[i].x = n + 1 - temp_x;
point[i].y = m + 1 - temp_y;
}
}
else if(k == 3)
{
for(int i = 0;i < p;i++)
{
int temp_x = point[i].x;
int temp_y = point[i].y;
point[i].x = m + 1 - temp_y;
point[i].y = temp_x;
}
int temp = n;
n = m;
m = temp;
}
}
void horizontal_rotate(int k)
{
k = k % 2;
if(k == 0)
return;
for(int i = 0;i < p;i++)
point[i].y = m + 1 - point[i].y;
}
void counterclockwise (int k)
{
k = k % 4;
if(k == 1)
{
for(int i = 0;i < p;i++)
{
int temp_x = point[i].x;
int temp_y = point[i].y;
point[i].x = m + 1 - temp_y;
point[i].y = temp_x;
}
int temp = n;
n = m;
m = temp;
}
else if(k == 2)
{
for(int i = 0;i < p;i++)
{
int temp_x = point[i].x;
int temp_y = point[i].y;
point[i].x = n + 1 - temp_x;
point[i].y = m + 1 - temp_y;
}
}
else if(k == 3)
{
for(int i = 0;i < p;i++)
{
int temp_x = point[i].x;
int temp_y = point[i].y;
point[i].x = temp_y;
point[i].y = n + 1 - temp_x;
}
int temp = n;
n = m;
m = temp;
}
}
int main()
{
while(cin >> n >> m >> x >> y >> z >> p)
{
for(int i = 0;i < p;i++)
cin >> point[i].x >> point[i].y;
clockwise(x);
horizontal_rotate(y);
counterclockwise(z);
for(int i = 0;i < p;i++)
cout << point[i].x << " " << point[i].y << endl;
}
return 0;
}