不一样的S型方阵


纯模拟,从(1,n)位置开始模拟,到达行边界考虑右下方是否有值,没有就右下走,有就往左走,到达列边界考虑左上方是否有值,没有就往左上方走,有就往下走


#include <stdio.h>
#include <memory.h>
using namespace std;
#define MAX 31
int n;
int a[MAX][MAX];

void Init();
void Order();
void vOut();

int main()
{
    while(1==scanf("%d",&n))
    {
        Init();
        Order();
        vOut();
    }
    return 0;
}
void Init()
{
    memset(a,0,sizeof(a));
}
void Order()
{
    int i,j,dig;
    dig=1;
    i=1;
    j=n;
    a[i][j]=dig;
    a[i][--j]=++dig;
    a[++i][++j]=++dig;
    int flag=0;
    int sum=n*(n+1)/2;
    while(dig<sum)
    {
        if(i==1)
        {
            if(a[i+1][j+1]!=0)
            {
                a[i][--j]=++dig;
                flag=1; //从上往下
            }
            else
            {
                a[++i][++j]=++dig;
                 flag=1; //从上往下
            }
        }
        else if(j==n)
        {
            if(a[i-1][j-1]!=0)
            {
                a[++i][j]=++dig;
                 flag=2; //从下往上
            }
            else
            {
                a[--i][--j]=++dig;
                flag=2; //从下往上
            }

    }
        if(flag==1)
        {
            a[++i][++j]=++dig;
        }
        else if(flag==2)
        {
             a[--i][--j]=++dig;
        }
    }
    sum=n*n;
    while(dig<=sum)
    {
        if(j==1)
        {
            if(a[i+1][j+1]!=0)
            {
                a[++i][j]=++dig;
                flag=1; //从上往下
            }
            else
            {
                a[++i][++j]=++dig;
                 flag=1; //从上往下
            }
        }
        else if(i==n)
        {
            if(a[i-1][j-1]!=0)
            {
                a[i][--j]=++dig;
                 flag=2; //从下往上
            }
            else
            {
                a[--i][--j]=++dig;
                flag=2; //从下往上
            }
        }
        if(flag==1)
        {
            a[++i][++j]=++dig;
        }
        else if(flag==2)
        {
             a[--i][--j]=++dig;
        }
    }

}
void vOut()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            printf("%4d",a[i][j]);
        }
            printf("\n");
    }
    for(i=1;i<=n;i++)
    {
        printf("====");
    }
    printf("\n");
}




结果显示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值