https://onlinejudge.u-aizu.ac.jp/challenges/sources/ICPC/Prelim/1625
解法
https://onlinejudge.u-aizu.ac.jp/solutions/problem/1625/review/3029479/hamayanhamayan/C++14
シミュレーションを頑張る。
実装方針としては「A[y][x] = 座標(x,y)に何枚重なっているか」を更新しながら実装する。
H,Wが変わっていくが、紙がない部分はA[y][x]=0としておいて、H,Wは変えないようにしておくと少し考えることが減る。
後は頑張って実装。
int W, H, T, P; int A[2][101][101]; //--------------------------------------------------------------------------------------------------- void _main() { while (cin >> W >> H >> T >> P) { if (W == 0) return; rep(t, 0, 2) rep(y, 0, 101) rep(x, 0, 101) A[t][y][x] = 0; rep(y, 0, H) rep(x, 0, W) A[0][y][x] = 1; rep(t, 0, T) { int d, c; cin >> d >> c; rep(y, 0, 101) rep(x, 0, 101) A[(t + 1) % 2][y][x] = 0; if (d == 1) { rep(y, 0, H) rep(x, 0, W) A[(t + 1) % 2][y][x] = A[t % 2][y][x + c]; rep(x, 0, c) rep(y, 0, H) A[(t + 1) % 2][y][x] += A[t % 2][y][c - 1 - x]; } else { rep(y, 0, H) rep(x, 0, W) A[(t + 1) % 2][y][x] = A[t % 2][y + c][x]; rep(x, 0, W) rep(y, 0, c) A[(t + 1) % 2][y][x] += A[t % 2][c - 1 - y][x]; } } rep(p, 0, P) { int x, y; cin >> x >> y; printf("%d\n", A[T % 2][y][x]); } } }