1. 程式人生 > >洛谷10月月賽II

洛谷10月月賽II

#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; }

 

待補……