#A: P4924 [1007]魔法少女小Scarlet
这道题考了矩阵旋转
其实很考验推公式的能力和代码能力
这里有个小技巧
可以设(x, y)为原点,然后去推公式,然后实际操作中横坐标加上x,纵坐标加上y就好了。
顺时针(i, j) -> (j, -i)
逆时针(i, j) -> (-j, i)
#include<bits/stdc++.h> #define REP(i, a, b) for(register int i = (a); i < (b); i++) #define _for(i, a, b) for(register int i = (a); i <= (b); i++) using namespace std; const int MAXN = 500 + 10; int a[MAXN][MAXN], t[MAXN][MAXN]; int n, m; void read(int& x) { int f = 1; x = 0; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } x *= f; } void work(int x, int y, int r, int z) { _for(i, -r, r) _for(j, -r, r) { if(z == 1) t[x+i][y+j] = a[x+j][y-i]; else t[x+i][y+j] = a[x-j][y+i]; } _for(i, -r, r) _for(j, -r, r) a[i+x][j+y] = t[i+x][j+y]; } int main() { read(n); read(m); _for(i, 1, n) _for(j, 1, n) a[i][j] = (i - 1) * n + j; while(m--) { int x, y, r, z; read(x); read(y); read(r); read(z); work(x, y, r, z); } _for(i, 1, n) { _for(j, 1, n) printf("%d ", a[i][j]); puts(""); } return 0; }
待补……