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