N阶幻方

对于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]);
        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值