codeforces C. Inna and Huge Candy Matrix 解题报告

题目链接:http://codeforces.com/problemset/problem/400/C

题目意思:给出一个n行m列的矩阵,问经过 x 次clockwise,y 次 horizontal rotate 和z次counterclockwise 之后,原来在n行m列的矩阵的坐标去到哪个位置。

    题目意思很容易看懂。易知,对于clockwise,counterclockwise的次数,mod 4 == 0 相当于没有改变!而对于 horizontal rotate,mod 2 == 0 也是没有改变的!

   假设问的坐标是(i, j),那么经过一次clockwise的转变,坐标变为(j, n-i+1),交换 n 和 m 值。

   经过一次 horizontal rotate,坐标为(i, m-j+1)

   经过一次counterclockwise,坐标为(m-j+1, i),交换 n 和 m 值

   特别要注意,计算完一个点的位置之后,n和m有可能与原始输入的n和m的值不同,因此需要记录原始输入的 n 和 m !!!因为题目问的是原始输入下的每个坐标点经过x,y,z次转换后的位置,并不是在计算完上一个坐标点后调整过的n 和 m。

   

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int n, m;
 8 int x, y;
 9 
10 void clockwise(int cnt)
11 {
12     for (int i = 1; i <= cnt; i++)
13     {
14         int t = x;
15         x = y;
16         y = n-t+1;
17         swap(n, m);
18     }
19 }
20 
21 void hor_rotate()
22 {
23     y = m - y + 1;
24 }
25 
26 void counterclockwise(int cnt)
27 {
28     for (int i = 1; i <= cnt; i++)
29     {
30         int t = x;
31         x = m - y + 1;
32         y = t;
33         swap(n, m);
34     }
35 }
36 
37 int main()
38 {
39     int i, a, b, c, p;
40     while (scanf("%d%d%d%d%d%d", &n, &m, &a, &b, &c, &p) != EOF)
41     {
42         int tn, tm;
43         tn = n;
44         tm = m;
45         for (i = 1; i <= p; i++)
46         {
47             n = tn;
48             m = tm;
49             scanf("%d%d", &x, &y);
50             if (a % 4)
51                 clockwise(a%4);
52             if (b % 2)
53                hor_rotate();
54             if (c % 4)
55                 counterclockwise(c%4);
56             printf("%d %d
", x, y);
57         }
58     }
59     return 0;
60 }

   

原文地址:https://www.cnblogs.com/windysai/p/3618255.html