对于n阶幻的定义和详解,请点击传送门:叫我萌萌哒的传送门。
我自己写了一下代码实现,代码写的有点渣,将就看。。。。
1:奇数阶
void dfs(int x,int y)
{
if(k==n*n+1)
return ;
int fx=x-1>=1?x-1:n;
int fy=y+1>n?1:y+1;
if(a[fx][fy]==0)
{
a[fx][fy]=k++;
dfs(fx,fy);
}
else
{
a[x+1][y]=k++;
dfs(x+1,y);
}
}
void solo1()
{
k=1;
int mid=(n+1)>>1;
a[1][mid]=k++;
dfs(1,mid);
}
2:双偶数阶
void solo2()
{
int k=1;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
a[i][j]=k++;
for(int i=1; i<=n/2; i++)
{
swap(a[i][n+1-i],a[n+1-i][i]);
}
for(int i=1; i<=n/2; i++)
swap(a[i][i],a[n+1-i][n+1-i]);
}
3:单偶数阶(这里多说一句,在第三步中提到的“A表中的其他行则标出最左边的n格中的数” n格指的是前n个格,不是第n个。
void dfs1(int x,int y)//创建A表。
{
if(k==nn*nn+1)
return ;
int fx=x-1>=1?x-1:nn;
int fy=y+1>nn?1:y+1;
if(a[fx][fy]==0)
{
a[fx][fy]=k++;
dfs1(fx,fy);
}
else
{
a[x+1][y]=k++;
dfs1(x+1,y);
}
}
void dfs2(int x,int y)//创建D表。
{
if(k==nn*nn*2+1)
return ;
int fx=x-1>=nn+1?x-1:n;
int fy=y+1>n?nn+1:y+1;
if(a[fx][fy]==0)
{
a[fx][fy]=k++;
dfs2(fx,fy);
}
else
{
a[x+1][y]=k++;
dfs2(x+1,y);
}
}
void dfs3(int x,int y)//创建B表。
{
if(k==nn*nn*3+1)
return ;
int fx=x-1>=1?x-1:nn;
int fy=y+1>n?nn+1:y+1;
if(a[fx][fy]==0)
{
a[fx][fy]=k++;
dfs3(fx,fy);
}
else
{
a[x+1][y]=k++;
dfs3(x+1,y);
}
}
void dfs4(int x,int y)//创建C表。
{
if(k==nn*nn*4+1)
return ;
int fx=x-1>=nn+1?x-1:n;
int fy=y+1>nn?1:y+1;
if(a[fx][fy]==0)
{
a[fx][fy]=k++;
dfs4(fx,fy);
}
else
{
a[x+1][y]=k++;
dfs4(x+1,y);
}
}
void solo3()
{
k=1;
nn=n/2;
int mid=(nn+1)>>1;
a[1][mid]=k++;
dfs1(1,mid);
a[nn+1][mid+nn]=k++;
dfs2(nn+1,mid+nn);
a[1][mid+nn]=k++;
dfs3(1,mid+nn);
a[nn+1][mid]=k++;
dfs4(nn+1,mid);
int flag=(n-2)/4;//flag是讲解中的N,,nn是每个表的大小,nnn是每个表的中心。
int nnn=(nn+1)>>1;
for(int i=1; i<=flag; i++)
{
swap(a[nnn][nnn+i-1],a[nnn+nn][nnn+i-1]);
}
for(int i=1; i<=nn; i++)
{
if(i==nnn)
continue;
for(int j=1; j<=flag; j++)
{
swap(a[i][j],a[i+nn][j]);
}
}
flag--;
if(flag==0)
return ;
for(int i=1; i<=flag; i++)
{
for(int j=1; j<=nn; j++)
{
swap(a[j][nnn+nn-i+1],a[j+nn][nnn+nn-i+1]);
}
}
}