矩阵填数V3

题目链接:点击打开链接

来源:湖南文理学院OJ

题目描述:给你一个整数N,要求输出对应的矩阵

输入描述:

N
数据范围
1≤N≤500

输出描述:

一个N*N的矩阵
示例1:

输入:

4

输出:

1 8 7
2 9 6
3 4 5
示例2:

输入:

4

输出:

1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7

题目分析:由案例可以看出矩阵的走势,所以只需要创一个方向矩阵即可,具体操作看代码。

#include <stdio.h>
#include <stdlib.h>
int b[501][501];
int main()
{
    int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//方向矩阵向下走,向右走,向上走,向下走。
    int N,x=0,y=1,tx,ty,i,j,a=1,flag;
    scanf("%d",&N);
    for(i=1; i<=N*N; i++)
    {
        flag=0;
        for(j=0; j<4; j++)
        {
            if(tx==a&&ty!=a)//当tx==a&&ty!=a时说明是第二次到a行此时需要一直往左边走
            {
                if(ty==a+1)//此时在左边已经走过后一个位置
                {
                    a++;//为下一行做准备
                    i--;//此时j=0,却并没有往下走所以在当前循环中i并不会填入b数组      
                }
                else
                {
                    tx=x;
                    ty=y-1;//往左边走
                }
            }
            else//下,右,上,左遍历。
            {
                tx=x+next[j][0];
                ty=y+next[j][1];
            }
            if(b[tx][ty]==0&&tx>0&&tx<=N&&ty>=0&&ty<=N)//判断tx,ty位置是否已经有数,以及走第一层时是是否越界
            {
                b[tx][ty]=i;
                flag=1;
                break;
            }
        }
        if(flag==1)//只有填了数时x,y才改变。
        {
            x=tx;
            y=ty;
        }
    }
    for(i=1; i<=N; i++)
    {
        for(j=1; j<=N; j++)
        {
            if(j!=N)
                printf("%d ",b[i][j]);
            else
                printf("%d\n",b[i][j]);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值