AOJ 0209 Scene in a Picture

問題

日本語なので特に説明はないです。何故、数ヶ月にWAだしたのか分からない問題、放置してた。

解法

切れ端を90度ずつ回転させたのを配列に入れておいて、全探索。 O(4n2m2)ぐらいかなと思ってたけど以外に速く終わった。

コード

int pic[100][100];
int piece[4][50][50];
int n, m;

bool ck(int sy, int sx, int d){
  rep(i, m) rep(j, m){
    if(piece[d][i][j] == -1) continue;
    if(pic[sy+i][sx+j] != piece[d][i][j]) return false;
  }
  return true;
}

int main(){
  while(scanf("%d%d", &n, &m) && n+m){
    rep(i, n) rep(j, n) scanf("%d", &pic[i][j]);
    rep(i, m) rep(j, m) scanf("%d", &piece[0][i][j]);
    REP(k, 1, 4){
      rep(i, m) rep(j, m) piece[k][j][m-i-1] = piece[k-1][i][j];
    }

    rep(i, n-m+1) rep(j, n-m+1) rep(k, 4){
      if(ck(i, j, k)){
    rep(l, m) rep(h, m) if(piece[k][l][h] != -1){
      printf("%d %d\n", j+h+1, i+l+1);
      goto end;
    }
      }
    }
    puts("NA");
  end:;
  }
  return 0;
}