■0209 Scene in a Picture
全探索.
計算量はO(m2n2)だが,1002502=2.5*107なので余裕.
import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
public class Main{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
int m, n;
int[][] a, b;
void run(){
for(;;){
m=sc.nextInt();
n=sc.nextInt();
if((m|n)==0){
break;
}
a=new int[m][m];
b=new int[n][n];
for(int j=0; j<m; j++){
for(int i=0; i<m; i++){
a[j][i]=sc.nextInt();
}
}
for(int j=0; j<n; j++){
for(int i=0; i<n; i++){
b[j][i]=sc.nextInt();
}
}
solve();
}
}
void solve(){
int[][][] c=new int[4][n][n];
for(int j=0; j<n; j++){
for(int i=0; i<n; i++){
c[0][j][i]=b[j][i];
c[1][i][n-1-j]=b[j][i];
c[2][n-1-j][n-1-i]=b[j][i];
c[3][n-1-i][j]=b[j][i];
}
}
int p=m*m;
for(int i=0; i<4; i++){
p=min(p, match(c[i]));
}
if(p==m*m){
println("NA");
}else{
println((p%m+1)+" "+(p/m+1));
}
}
int match(int[][] c){
for(int y=0; y+n<=m; y++){
for(int x=0; x+n<=m; x++){
boolean f=true;
for(int j=0; j<n; j++){
for(int i=0; i<n; i++){
f&=c[j][i]==-1||c[j][i]==a[y+j][x+i];
}
}
if(f){
for(int j=0; j<n; j++){
for(int i=0; i<n; i++){
if(c[j][i]!=-1){
return (y+j)*m+(x+i);
}
}
}
}
}
}
return m*m;
}
void debug(Object... os){
System.err.println(Arrays.deepToString(os));
}
void print(String s){
System.out.print(s);
}
void println(String s){
System.out.println(s);
}
public static void main(String[] args){
// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
new Main().run();
}
}
0 件のコメント:
コメントを投稿