PKU 3509 Rotating Rings

http://poj.org/problem?id=3509
与えられたnxnの数字を、中心に対して同じ距離ごとに回転させて、ちゃんと並べられたものに出来るかを判定しろというような問題。

実装ゲー。

int in[1000][1000];
int no[1000][1000];
int n;

int iarr[10000];
int narr[10000];

bool check(int di){
  int le=n-di*2;
  if(le==1)return in[di][di]==no[di][di];
  int x=di,y=di;
  int sz=0;
  rep(i,4){
    rep(j,le-1){
      iarr[sz]=in[x][y];
      narr[sz]=no[x][y];
      ++sz;
      x+=dx[i];
      y+=dy[i];
    }
  }
  rep(i,sz){
    if(iarr[i]==narr[0]){
      rep(j,sz){
        if(iarr[(i+j)%sz]!=narr[j])return false;
      }
      return true;
    }
  }
  return false;
}

main(){
  int k=0;
  while(scanf("%d",&n),n){
    rep(i,n)
      rep(j,n){
      scanf("%d",in[i]+j);
      no[i][j]=i*n+j+1;
    }
    bool ok=true;
    rep(i,(n+1)/2){
      if(check(i))continue;
      ok=false;
      break;
    }
    cout<<++k<<". "<<(ok?"YES":"NO")<<endl;
  }
}