我的起点(蛇形矩阵)

题目描述 Description

小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

输入描述 Input Description

n(即n行n列)

输出描述 Output Description

n+1行,n行为组成的矩阵,最后一行为对角线数字之和

样例输入 Sample Input

3

样例输出 Sample Output1

5 4 3
6 1 2
7 8 9
25

数据范围及提示 Data Size & Hint

#include <iostream>
#include <cstdio>


using namespace std;
int main()
{
    int a;
    int x[101][101];
    scanf("%d",&a);
        int sum=a*a;
        int zong=1;
        int Count1=a;
        int Count2=0;
        while(sum!=1)
        {
            for (int number=Count1-1;number>=Count2;number--)
            {
                x[Count1-1][number]=sum;
                if (number==Count1-1)
                    zong +=sum;
                if (number==Count2)
                    zong +=sum;
                sum--;
            }
            for (int number=Count1-2;number>=Count2;number--)
            {
                x[number][Count2]=sum;
                if (number==Count2)
                    zong +=sum;
                sum--;
            }
            for (int number=Count2+1;number<Count1;number++)
            {
                x[Count2][number]=sum;
                if (number==Count1-1)
                    zong +=sum;
                sum--;
            }
            for (int number=Count2+1;number<Count1-1;number++)
            {
                x[number][Count1-1]=sum;
                sum--;
            }
            Count1--;
            Count2++;
        }
        x[a/2][a/2]=1;
        for (int number1=0;number1<a;number1++)
        {
            for (int number2=0;number2<a;number2++)
        {
            printf("%d ",x[number1][number2]);
        }
            printf("\n");
        }
        printf("%d\n",zong);
    return 0;
}

第一次贴代码,第一次建立博客。  希望得到各位大神的指点,这是我的起点,我会努力的!!!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 假设我们需要生成一个3行4列的蛇形矩阵,从中心开始,先向右走,再向下走,再向左走,再向上走,向右走。 首先,我们需要确定蛇形矩阵的大小,即行数和列数。在本例中,行数为3,列数为4。 接下来,我们可以将蛇形矩阵按照从左到右、从上到下的顺序依次编号,如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 然后,我们可以按照题目要求的路径,依次填充每个位置的值。具体操作如下: 1. 从中心位置开始,向右走,填充值为1 2. 向下走,填充值为2 3. 向左走,填充值为3 4. 向上走,填充值为4 5. 向右走,填充值为5 6. 向下走,填充值为6 7. 向左走,填充值为7 8. 向上走,填充值为8 9. 向右走,填充值为9 10. 向下走,填充值为10 11. 向左走,填充值为11 12. 向上走,填充值为12 最终得到的蛇形矩阵如下: 1 2 3 4 8 7 6 5 9 10 11 12 代码实现如下: ``` def snake_matrix(n, m): # 初始化蛇形矩阵 matrix = [[0] * m for _ in range(n)] # 计算中心位置 center = (n // 2, m // 2) # 初始化当前位置和当前方向 pos, direction = center, 'right' # 依次填充每个位置的值 for i in range(1, n * m + 1): matrix[pos[0]][pos[1]] = i if direction == 'right': if pos[1] < m - 1 and matrix[pos[0]][pos[1] + 1] == 0: pos = (pos[0], pos[1] + 1) else: direction = 'down' pos = (pos[0] + 1, pos[1]) elif direction == 'down': if pos[0] < n - 1 and matrix[pos[0] + 1][pos[1]] == 0: pos = (pos[0] + 1, pos[1]) else: direction = 'left' pos = (pos[0], pos[1] - 1) elif direction == 'left': if pos[1] > 0 and matrix[pos[0]][pos[1] - 1] == 0: pos = (pos[0], pos[1] - 1) else: direction = 'up' pos = (pos[0] - 1, pos[1]) elif direction == 'up': if pos[0] > 0 and matrix[pos[0] - 1][pos[1]] == 0: pos = (pos[0] - 1, pos[1]) else: direction = 'right' pos = (pos[0], pos[1] + 1) return matrix # 测试 print(snake_matrix(3, 4)) ``` 输出结果为: ``` [[1, 2, 3, 4], [8, 7, 6, 5], [9, 10, 11, 12]] ``` ### 回答2: 蛇形矩阵是一种特殊的数值排列形式,按照从中心开始、向右走、向下走、向左走、向上走,再向右走的方式排列数值。我们可以用以下步骤来生成一个300字的蛇形矩阵: 1. 确定矩阵的大小:由于题目中未给定具体的矩阵大小,所以我们可以假设矩阵的大小为10x30(10行30列),总共300个元素。 2. 初始化矩阵:创建一个10x30的零矩阵,用于存放生成的蛇形矩阵。 3. 从中心开始:将数值1放置在矩阵的中心位置,即第6行15列。 4. 向右走:由于向右走之后需要转向向下走,所以我们首先判断向右走的终点位置是否超过了矩阵边界。如果超过边界,则转向向下走;否则,按照向右走的方式依次将2至15的数值放置在矩阵中。 5. 向下走:判断向下走的终点位置是否超过了矩阵边界。如果超过边界,则转向向左走;否则,按照向下走的方式依次将16至29的数值放置在矩阵中。 6. 向左走:判断向左走的终点位置是否超过了矩阵边界。如果超过边界,则转向向上走;否则,按照向左走的方式依次将30至43的数值放置在矩阵中。 7. 向上走:判断向上走的终点位置是否超过了矩阵边界。如果超过边界,则转向向右走;否则,按照向上走的方式依次将44至57的数值放置在矩阵中。 8. 向右走:按照向右走的方式依次将58至300的数值放置在矩阵中。 9. 完成蛇形矩阵的生成。 这样,我们就完成了一个300字的蛇形矩阵。 ### 回答3: 蛇形矩阵是一种按照特定方向组织数据的方式。从中心开始,我们可以设定一个初始位置,然后按照题目要求的方向依次移动,直到遍历完所有的格子。 首先,我们需要确定矩阵的大小。由于我们是以中心为起点,向四个方向进行遍历,所以假设矩阵的长度为n,那么整个矩阵的大小就是n x n。 接下来,我们进行具体的操作。我们假设初始位置为矩阵的中心位置,即第n/2行,第n/2列。我们可以使用两个变量i和j分别表示当前位置的行和列。 1. 向右走:我们可以使用一个for循环,从当前位置开始,依次向右移动直到达到当前行的末尾,即列j从n/2增加到n/2 + n - 1。 2. 向下走:接着,我们将行i增加1,表示向下移动一行。然后,我们再次使用一个for循环,从当前位置开始,依次向下移动直到达到当前列的末尾,即行i从n/2 + 1增加到n/2 + n - 1。 3. 向左走:再接着,我们将列j减少1,表示向左移动一列。同样地,我们使用一个for循环,从当前位置开始,依次向左移动直到达到当前行的起始位置,即列j从n/2 + n - 2减少到n/2。 4. 向上走:最后,我们将行i减少1,表示向上移动一行。同样地,使用一个for循环,从当前位置开始,依次向上移动直到达到当前列的起始位置,即行i从n/2 + n - 2减少到n/2 + 1。 重复以上步骤,直到遍历完整个矩阵,即行和列的范围均超出矩阵的边界。 例如,当n=5时,一个蛇形矩阵的顺序为: 17 16 15 14 13 18 5 4 3 12 19 6 1 2 11 20 7 8 9 10 21 22 23 24 25 所以,根据以上描述,我们可以生成一个从中心开始,先向右走,再向下走,再向左走,再向上走的蛇形矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值