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