AOJ - Problem 0209 : Scene in a Picture
ただ実装するだけの問題ですがとても面倒なので落ち着いてコードを書かないとバグが入り込むかもしれません。
#include <iostream> #include <map> using namespace std; typedef pair<int,int> P; int n,m,f[101][101],s[51][51]; bool search(int sx, int sy){ for(int y=sy ; y-sy < m ; y++ ){ for(int x=sx ; x-sx < m ; x++ ){ int mx = x-sx; int my = y-sy; if( s[my][mx] == -1 ){ continue; }else if( f[y][x] != s[my][mx] ){ return false; } } } return true; } P check(){ for(int y=0 ; y < m ; y++ ){ for(int x=0 ; x < m ; x++ ){ if( s[y][x] != -1 ){ P p(y,x); return p; } } } } void rot(){ int r[51][51]; for(int y=0 ; y < m ; y++ ){ for(int x=0 ; x < m ; x++ ){ r[x][m-y-1] = s[y][x]; } } for(int y=0 ; y < m ; y++ ){ for(int x=0 ; x < m ; x++ ){ s[y][x] = r[y][x]; } } } int main(){ while( cin >> n >> m , n||m ){ bool ans = false; int ax,ay; P p(100,100); for(int y=0 ; y < n ; y++ ){ for(int x=0 ; x < n ; x++ ){ cin >> f[y][x]; } } for(int y=0 ; y < m ; y++ ){ for(int x=0 ; x < m ; x++ ){ cin >> s[y][x]; } } for(int i=0 ; i < 4 ; i++ ){ rot(); for(int y=0 ; y+m <= n ; y++ ){ for(int x=0 ; x+m <= n ; x++ ){ if( search( x , y ) == true ){ ans = true; P p_ = check(); p_.first += y; p_.second += x; p = min( p , p_ ); } } } } if( ans ){ cout << (p.second+1) << " " << (p.first+1) << endl; }else{ cout << "NA" <<endl; } } }