09年8月14日 ECUST ACM 练习赛总结
x=k,y=k//设初值,就是l为0时的值
if(l<n-2k)
x+=l
else if(l<2n-4k-1)
x+=n-2k-1,y+=l-n+2k+1
else if(l<3n-6k-2)
y+=n-2k-1,x+=3n-6k-l-3
else
y += 4n-8k – 4 – l#include<iostream>
using namespace std;
#define MAXN 2000
struct Position
{
int x,y;
};
Position GetPosition(long n,long k,long l);
bool check(int n,int k);
long mat[MAXN][MAXN];
long matMol[MAXN][MAXN];
int main()
{
int n,t = 0;
while(scanf("%d",&n), n)
{
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
scanf("%ld",&mat[i][j]) , matMol[i][j] = i * n + j + 1;
int k;
for( k = 0 ; k <= (n - 1) / 2 ; k ++)
if(!check(n,k))
break;
if(k <= (n - 1) / 2)
printf("%d. NO\n", ++ t);
else
printf("%d. YES\n", ++ t);
}
return 0;
}
Position GetPosition(long n,long k,long l)
{
Position tmpPos;
tmpPos.x = tmpPos.y = k;
if(n - 1 - 2 * k)
l = l % (4 * (n - 1 - 2 * k));
else
return tmpPos;
if(l < n - 2 * k)
tmpPos.x += l;
else if(l < 2 * n - 4 * k - 1)
tmpPos.x += n - 2 * k - 1 , tmpPos.y += l - (n - 2 * k) + 1;
else if(l < 3 * n - 6 * k - 2)
tmpPos.y += n - 2 * k - 1,tmpPos.x += 3 * n - 6 * k - l - 3;
else
tmpPos.y += 4 * n - 8 * k - 4 - l;
return tmpPos;
}
bool check(int n,int k)
{
long pos2 , i;
long numSum = 4 * (n - 1 - 2 * k);
Position tmpSource = GetPosition(n,k,0);
for(pos2 = 0 ; pos2 < numSum ; pos2 ++)
{
Position tmpPos = GetPosition(n,k,pos2);
if(mat[tmpPos.y][tmpPos.x] == matMol[tmpSource.y][tmpSource.x])
break;
}
if(pos2 >= 4 * numSum)
if(numSum)
return false;
else
return mat[tmpSource.y][tmpSource.x] == matMol[tmpSource.y][tmpSource.x];
for(i = 1 ; i < 4 * numSum ; i ++)
{
tmpSource = GetPosition(n,k,i);
Position tmpPos = GetPosition(n,k,pos2 + i);
if(mat[tmpPos.y][tmpPos.x] != matMol[tmpSource.y][tmpSource.x])
return false;
}
return true;
}Last updated
Was this helpful?