静かで孤独な日記

のんびりたまに

AOJ1625 折り紙(Origami, or the art of folding paper)

#include<bits/stdc++.h>
using namespace std;
 
int main() {
  int hh, w, t, p;
  while (cin >> w >> hh >> t >> p, w) {
    int res[40][40];
    for (int i = 0; i < 40; i++) for (int j = 0; j < 40; j++) res[i][j] = 0;
    for (int i = 0; i < hh; i++) for (int j = 0; j < w; j++) res[i][j] = 1;
    for (int ii = 0; ii < t; ii++) {
      int d, c; cin >> d >> c;
      int tmp[40][40];
      for (int i = 0; i < 40; i++) for (int j = 0; j < 40; j++) tmp[i][j] = 0;
      if (d == 1) {
        // d == 1
        for (int i = 0; i < 40; i++) {
          for (int j = c; j < 40; j++) {
            tmp[i][j - c] += res[i][j];
          }
        }
        for (int i = 0; i < 40; i++) {
          for (int j = c - 1; j >= 0; j--) {
            tmp[i][c - 1 - j] += res[i][j];
          }
        }
      } else {
        // d == 2
        int h = 0;
        for (int i = 0; i < 40; i++) {
          if (res[i][0] != 0) h++;
        }
        if (c >= h - c) {
          for (int i = h - 1; i >= h - c; i--) {
            for (int j = 0; j < 40; j++) {
              tmp[h - 1 - i][j] += res[i][j];
            }
          }
          for (int i = 0; i < h - c; i++) {
            for (int j = 0; j < 40; j++) {
              tmp[i + 2 * c - h][j] += res[i][j];
            }
          }
        } else {
          for (int i = 0; i < h - c; i++) {
            for (int j = 0; j < 40; j++) {
              tmp[i][j] += res[i][j];
            }
          }
          int now = c;
          for (int i = h - 1; i >= h - c; i--) {
            for (int j = 0; j < 40; j++) {
              tmp[i - 2 * now + 1][j] += res[i][j];
            }
            now--;
          }
        }
      }
      //tmp -> res
      for (int i = 0; i < 40; i++) {
        for (int j = 0; j < 40; j++) {
          res[i][j] = tmp[i][j];
        }
      }
    int hlen = 0;
    for (int i = 0; i < 40; i++) {
      if (res[i][0] != 0) hlen++;
    }
    for (int i = 0; i < p; i++) {
      int x, y; cin >> x >> y;
      cout << res[hlen - 1 - y][x] << endl;
    }
  }
}
  • 何かいうとしたら、「ただただ面倒くさいことをする」に尽きるかと思います。
  • 難しいことはやっていないんですけど、バグると時間を食う系の問題というか、どれだけ集中して実装できるかみたいなのが重要なのかなーと。
  • 考察の段階で要所の紙コーディングまでして完全に詰めきってから実装しました。