蛇形矩阵(以后遇到在做补充)

本文详细介绍了两种蛇形矩阵的实现方法,一种是从中心逆时针绕行递增,另一种是从边界值入手,遵循特定规则填充数字,直至完成整个矩阵。通过具体的代码示例,展示了如何使用C++来解决这两类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我所遇到的第一种便是code vs上的 1160蛇形矩阵

题目描述的矩阵:

在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

首先看到题就该思考,我从中心开始逆时针方向绕行递增,那么中心的位置不好找,我们可以从临界值入手。也就是最大值,从最后一个值一直模拟,直到数字为1为止。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

int mp[120][120];
int main()
{
    int n;
    scanf("%d",&n);
    int i = n*n;
    int x = n - 1,y = n - 1;
    mp[x][y] = i--;
    while(i)
    {
        while(y - 1 >= 0 && !mp[x][y - 1]) mp[x][--y] = i--;
        while(x - 1 >= 0 && !mp[x - 1][y]) mp[--x][y] = i--;
        while(y + 1 < n && !mp[x][y + 1]) mp[x][++y] = i--;
        while(x + 1 < n && !mp[x + 1][y]) mp[++x][y] = i--;
    }
    for(int i = 0;i < n;++i)
    {
        for(int j = 0;j < n;++j)
            printf("%d ",mp[i][j]);//如果觉得数字不规整可以加上%xd作为输出格式
        printf("\n");
    }
    printf("%d\n",num);
    return 0;
}

 

输入
3
输出
7  8  1
6  9  2
5  4  3

第二种蛇形矩阵,出自《算法竞赛入门经典(第二版)》 第三章蛇形填数

题目描述:在1,2,...,n*n,要求填成蛇形。例如,n = 4时的方阵为:

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

这个题目和一开始的题目很相似,也就是说我们可以先从边界值入手,这里可以从1开始,遵循下,...,左...,上,...,右,...的规则,直到输出n*n为止。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;

int mp2[102][102];
int main()
{
    int n;
    scanf("%d",&n);
    int x = 0,y = n - 1;
    int t = 1;
    mp2[x][y] = 1;
    while(t < n*n)
    {
        while(x + 1 < n && !mp2[x + 1][y]) mp2[++x][y] = ++t;
        while(y - 1 >= 0&& !mp2[x][y - 1]) mp2[x][--y] = ++t;
        while(x - 1 >= 0 && !mp2[x - 1][y]) mp2[--x][y] = ++t;
        while(y + 1 < n && !mp2[x][y + 1]) mp2[x][++y] = ++t;
    }
    for(int i = 0;i < n;++i)
    {
        for(int j = 0;j < n;++j)
            printf("%2d ",mp2[i][j]);//题目样例中,数字已对齐。
        printf("\n");
    }
    return 0;
}
输入
3
输出
 7  8  1
 6  9  2
 5  4  3

个人感觉无论遇到怎么样的蛇形矩阵,只要找到一个边界点,并且按照题目的要求,把数字模拟运行出来即可。

关于模拟算法,我个人理解就是照着葫芦画瓢,至于这个瓢怎么画,更多的还是看个人的理解。

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值