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