AOJ 0209 - Scene in a Picture
12月にWA出して,1月にまたWA出して,ようやくACしました.
きれいに書けたよー
#include<iostream> //Memo: 90*n度回転で決まっても90*(n+1)度回転で最小になるかも //Memo: 最後まで //Memo: 配列の範囲 //Memo: 最上,左の条件 const int MAX_N = 100, MAX_M = 50, INF = 1 << 24; int photo[MAX_N][MAX_N], part[4][MAX_M][MAX_M];//part[n][_][_]: 90*n度回転した写真の一部 int n, m;//n: 写真, m: 一部 void rotate(){ for(int i=0;i<3;i++){ for(int j=0;j<m;j++){ for(int k=0;k<m;k++){ part[i+1][m-k-1][j] = part[i][j][k]; } } } } bool can(int index, int x, int y){//(x, y)を左端としてできるか for(int j=0;j<m;j++){ for(int k=0;k<m;k++){ if(photo[y+j][x+k] != part[index][j][k] && part[index][j][k] != -1)return false; } } return true; } void mostLeftTop(int index, int &x, int &y){//part[index]で-1以外の値を取る最左,上の座標をx, yに加える for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ if(part[index][i][j] != -1){ x += j; y += i; return; } } } } int main(){ while(std::cin >> n >> m, n){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ std::cin >> photo[i][j]; } } for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ std::cin >> part[0][i][j]; } } rotate(); int x = INF, y = INF;//できたときの左端の座標(最小) for(int i=0;i+m<=n;i++){ for(int j=0;j+m<=n;j++){ for(int k=0;k<4;k++){ if(can(k, j, i)){ int nx = j, ny = i; mostLeftTop(k, nx, ny); if(ny < y || (ny == y && nx < x))x = nx, y = ny; } } } } if(x == INF)std::cout << "NA" << std::endl; else std::cout << (x+1) << " " << (y+1) << std::endl; } }