c++蛇形矩阵

该文章介绍了如何使用坐标和偏移量的方法来填充蛇形矩阵。通过设置初始坐标、方向变量和数组边界判断,动态调整填充方向,实现1到n×m的数字顺序填充。代码示例展示了具体的实现过程。
摘要由CSDN通过智能技术生成

新人的第一个博客,废话不多说,直接上题目。

输入两个整数 n 和 m,输出一个 n 行 m 列的矩阵,将数字 1 到 n×m按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式

输入共一行,包含两个整数 n 和 m。

输出格式

输出满足要求的矩阵。

矩阵占 n 行,每行包含 m 个空格隔开的整数。

数据范围

1≤n,m≤100

输入样例

3 3

输出样例

1 2 3
8 9 4
7 6 5

蛇形矩阵,在网上还是有很多办法,这里我们用坐标和偏移量来解决。2ff652c65e2346c3abda64c9a84e0de1.jpg

题目要求我们打印一个二维数组n和m,数字的大小像一条蛇一样依次增大,而这里的难点就是如何让数字“拐弯”,这里我们就用我刚刚提到的坐标和偏移量解决。

首先呢,我们先把二维数组起始点作为坐标起点,设为(x,y),向上移动一格的话坐标就变为(x-1,y),向右的话移动一格坐标就变为(x,y+1),以此类推,向下(x+1,y),向左(x,y+1),x和y的偏移量分别用两个数组存储起来dx和dy。

#include<iostream>

using namespace std;

const int N=110;
int q[N][N];

int main()
{
    int n,m;
    cin>>n>>m;
    
    int x=0,y=0,d=1;
    int dx[]={-1,0,1,0},dy[]={0,1,0,-1};

然后再设两个变量a和b代表数组x轴和y轴的长度

再设一个变量d控制方向,假定d=1向右,d=2向下,d=3向左,d=0向上,这样d四个值就代表四个方向,那d怎么变化呢,当数组要转动方向的时候,d就+1,可以用先赋值d=1,d=(d+1)%4,这样就可以完美表示数组偏移方向,那我们如何判断数组要拐弯呢?

这里就有两种情况,第一种情况是当蛇撞墙的时候要拐弯,第二种情况是当蛇要咬到自己的时候要拐弯,所以这个时候就要判断一下,所以用代码表示就是if(a<=0‖a>n‖b<=0‖b>m‖q[a][b]),如果撞墙了,d+1,改变方向,a和b以改变,最后跳出判断,x和y刷新一下

    for(int i=1;i<=n*m;i++)
    {
        q[x][y]=i;
        int a=x+dx[d],b=y+dy[d];
        
        if(a<0||a>=n||b<0||b>=m||q[a][b])
        {
            d=(d+1)%4;
            a=x+dx[d],b=y+dy[d];
        }
        
        x=a,y=b;
    }

最后再把数组打印出来就行。完整代码如下

#include<iostream>

using namespace std;

const int N=110;
int q[N][N];

int main()
{
    int n,m;
    cin>>n>>m;
    
    int x=0,y=0,d=1;
    int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
    
    for(int i=1;i<=n*m;i++)
    {
        q[x][y]=i;
        int a=x+dx[d],b=y+dy[d];
        
        if(a<0||a>=n||b<0||b>=m||q[a][b])
        {
            d=(d+1)%4;
            a=x+dx[d],b=y+dy[d];
        }
        
        x=a,y=b;
    }
    
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cout<<q[i][j]<<' ';
        }
        cout<<endl;
    }
    
    return 0;
}

最后如果有什么问题或者疑惑的话欢迎指正和指出,谢谢!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值