Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用螺旋形式填充n×n矩阵的C程序

用螺旋形式填充n×n矩阵的C程序
EN

Stack Overflow用户
提问于 2022-01-03 06:04:17
回答 3查看 96关注 0票数 0

我正在实现一个C程序,使用函数填充一个方形矩阵的螺旋形式。以下是我已经做过的事:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <conio.h>

const N = 5;
int top = 0;
int bottom = N - 1;
int right = 0;
int left = N -1;

int main(){
    int z = 1 /*N = 5*/;
    int Array[100][100];
    while (z <= (N*N))
    {
        FillRowForward(Array, z);
        FillColumnDownward(Array, z);
        FillRowBackward(Array, z);
        FillColumnUpward(Array, z);
    }

    printf("Two dimensional array elements: \n");

    for (int i = 0; i < N; i++)
    {
        // printf("\t");
        for (int j = 0; j < N; j++)
        {
            printf("%d \t", Array[i][j]);
        }
        printf("\n");
    }

    return 0;
}


/*Definition of functions*/

int FillRowForward(int A[][N], /*int top, int left, int right,*/ int Z)
{
    for (int i = right; i <= left; i++)
    {
        A[top][i] = Z++;
    }
}

int FillColumnDownward(int A[][N], /*int top, int bottom, int right,*/ int Z)
{
    for (int j = top + 1; j <= bottom; j++)
    {
        A[j][bottom] = Z++;
    }
}

int FillRowBackward(int A[][N], /*int bottom, int left, int right,*/ int Z)
{
    for (int i = left - 1; i >= top; i--)
    {
        A[bottom][i] = Z++;
    }
}

int FillColumnUpward(int A[][N], /*int top, int bottom, int right,*/ int Z)
{
    for (int j = bottom - 1; j >= top + 1; j--)
    {
        A[j][left] = Z++;
    }

}

第一个函数应该填充第一行(FillRowForward),,下一个函数应该向下填充第一列,以此类推,直到所有矩阵都被填充。但当我运行时,它只显示一个黑色和空白的屏幕。没有输出。这件事需要帮忙!

EN

回答 3

Stack Overflow用户

发布于 2022-01-05 00:51:30

在您开始考虑实际程序正在做什么之前,需要修复此代码中的许多基本问题。我怀疑您正在使用Turbo或类似的一些过时的垃圾,因为这段代码不会在现代标准C中编译。

  • const N = 5;不使用隐式int,这应该是const int N = 5;
  • However,这个表达式中的初始化器int bottom = N - 1;不是一个整数常量表达式,所以这会导致问题。绝对没有理由在文件范围内声明所有这些变量,但是如果您声明了,则需要更改为#define N 5.
  • Don't在堆栈上声明大数组(如int Array[100][100]; )。这样做可能会导致堆栈溢出,这是非常困难和烦人的跟踪。
  • 循环条件,如i <= left;是可疑的。不要像i < left.
  • As在注释中指出的那样,将left初始化为N,然后编写循环条件,您可能希望通过指针传递z,这样调用者就可以知道它是modified.
  • You,因此在main()中调用函数时,没有任何函数声明可见,因此代码不会在现代编译器上编译。总是在main()之前编写原型格式函数声明器。
  • 函数期望int [][5]不能以int [100][100]作为参数,当这些数组“衰变”为指向其第一个元素的指针时,它会导致不兼容的指针类型。通过使用指向VLA的指针并传递数组大小:void function (size_t x, size_t y, int array[x][y]).

来修复这个问题

一旦解决了所有这些基本的C问题,就可以关注实际的算法了。如果您仍然无法使其工作后,修复上述所有,请张贴一个单独的问题与修改后的代码。

票数 0
EN

Stack Overflow用户

发布于 2022-01-03 06:24:17

目前尚不清楚应以何种方式填充该矩阵。我想Z应该一直在增加。如果是这样的话,那么您应该传递/接受z的指针。或者,由于您已经有了一些全局变量,z可能是全局的。

票数 -1
EN

Stack Overflow用户

发布于 2022-01-04 09:59:01

主要原因是在主函数int 100中创建的数组类型与单个函数int的参数类型不匹配。但是,您的代码中还有更多的问题。

我建议在C中不要使用本机2D数组,这很麻烦。您可以非常容易地使用一维数组,只需将坐标从x,y转换到i,反之亦然。

下面是重写为1D方法的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int Get(int a[], int n, int y, int x)
{
    return a[y * n + x];
}

void Set(int a[], int n, int y, int x, int z)
{
    a[y * n + x] = z;
}

int FillRowForward(int a[], int n, int turn, int z)
{
    for (int x = turn; x < n - turn - 1; x++)
        Set(a, n, turn, x, z++);
    return z;
}

int FillColumnDownward(int a[], int n, int turn, int z)
{
    int max = n - turn - 1;
    for (int y = turn; y < max; y++)
        Set(a, n, y, max, z++);
    return z;
}

int FillRowBackward(int a[], int n, int turn, int z)
{
    int max = n - turn - 1;
    for (int x = max; x > turn; x--)
        Set(a, n, max, x, z++);
    return z;
}

int FillColumnUpward(int a[], int n, int turn, int z)
{
    for (int y = n - turn - 1; y > turn; y--)
        Set(a, n, y, turn, z++);
    return z;
}

int Spiral(int a[], int n, int z)
{
    for (int turn = 0; turn < n / 2; turn++)
    {
        z = FillRowForward(a, n, turn, z);
        z = FillColumnDownward(a, n, turn, z);
        z = FillRowBackward(a, n, turn, z);
        z = FillColumnUpward(a, n, turn, z);
    }
    if (n % 2 == 1)
        Set(a, n, n / 2, n / 2, z++);

    return z;
}

void Print(int a[], int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%10d", Get(a, n, i, j));
        }
        printf("\n");
    }
}

int main()
{
    int N = 5;
    int Array[N * N];

    Spiral(Array, N, 0);

    printf("Two dimensional array elements: \n");
    Print(Array, N);

    return 0;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70566957

复制
相关文章
C语言 n*n矩阵求值及求逆矩阵[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/129010.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
3.1K0
C语言 n*n矩阵求值及求逆矩阵[通俗易懂]
用C语言求n以内的素数
素数又叫做质数(prime number),指的是在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,否则称为合数。合数除了1和这个数本身,还能被其他正整数整除。1既不是质数也不是合数。
天寒雨落
2022/11/20
1.9K0
实现两个N*N矩阵的乘法,矩阵由一维数组表示
实现两个N*N矩阵的乘法,矩阵由一维数组表示。 先介绍一下矩阵的加法: 1 void Add(int rows, int cols) 2 { 3 for(int i= 0;i<rows;i++) 4 { 5 for(int j=0;j<cols;j++) 6 result[i][j]=mat1[i][j]+mat2[i][j]; 7 } 8 } 若两个矩阵要做乘法运:只有在一
猿人谷
2018/01/17
1.3K0
编写js程序实现n的阶乘_javascript矩阵算法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/189139.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
1K0
实现两个N*N矩阵的乘法,矩阵由一维数组表示
实现两个N*N矩阵的乘法,矩阵由一维数组表示。 先介绍一下矩阵的加法: 1 void Add(int rows, int cols) 2 { 3 for(int i= 0;i<rows;i++) 4 { 5 for(int j=0;j<cols;j++) 6 result[i][j]=mat1[i][j]+mat2[i][j]; 7 } 8 } 若两个矩阵要做乘法运:只有在一
猿人谷
2018/01/17
2.3K0
实现两个N*N矩阵的乘法,矩阵由一维数组表示
实现两个N*N矩阵的乘法,矩阵由一维数组表示。 先介绍一下矩阵的加法: 1 void Add(int rows, int cols) 2 { 3 for(int i= 0;i<rows;i++) 4 { 5 for(int j=0;j<cols;j++) 6 result[i][j]=mat1[i][j]+mat2[i][j]; 7 } 8 } 若两个矩阵要做乘法运:只有在一
猿人谷
2018/01/17
1.2K0
[随缘一题]螺旋矩阵
PS 本题代码来源于九章算法. 来源 lintcode-螺旋矩阵 描述 给出整数 n, 返回一个大小为 n * n 的螺旋矩阵 样例 给出 n = 3 则螺旋矩阵为: [ [1,2,3] [8,9,4] [7,6,5] ] 给出 n = 5 则螺旋矩阵为: [ [1,2,3,4,5] [16,17,18,19,6] [15,24,25,20,7] [14,23,22,21,8] [13,12,11,10,9] ] 解题思路 这道题标的是简单题,但是我没做出来… 因此借鉴了九章算法的实现方法,链
呼延十
2019/07/01
8050
“小程序矩阵”时代来临 “小程序互跳”的N种玩法
  两个小程序终于实现跳转了,对于小程序来说,这是具有划时代意义的。我们来剖析一下这个能力的意义和玩法儿。6月21号晚官方放出新能力后,萤连长和几个小程序开发商简单聊了一下,基本达成了几点共识:1、大家一直在等这个能力。2、小程序的真正爆发期要来了。为什么说“真正的”爆发期?早在小程序宣布内测时,就有人放出豪言,小程序是变成大V的新红利,是赚取人生第一个100万的通路。但真到了小程序上线时,却没看到小程序的爆发力,反而很多人对此质疑、怯步。之后,小程序陆续发布20多项新能力,开发者慢慢感受到其中的奥妙,并在
ytkah
2018/03/06
2.2K0
“小程序矩阵”时代来临 “小程序互跳”的N种玩法
用栈解决N皇后问题(C语言)
首先最开始的是八皇后问题,是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,也是回溯算法的典型案例。
小Bob来啦
2020/12/08
2.1K0
用栈解决N皇后问题(C语言)
[Leetcode][python]Spiral Matrix/Spiral Matrix II/螺旋矩阵/螺旋矩阵 II
输入: matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] 输出: [1, 2, 3, 6, 9, 8, 7, 4, 5]
蛮三刀酱
2019/03/26
5480
求n!的位数以及求n!具体的值(C or C++)
首先我们先求n!位数 可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 M =log10^n! 即: M = log10^1+log10^2+log10^3…+log10^n 循环求和,就能算得M值,该M是n!的精确位数。
里克贝斯
2021/05/21
6770
模拟法螺旋遍历矩阵:54.螺旋矩阵(Kotlin)
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
一个会写诗的程序员
2021/04/16
5210
模拟法螺旋遍历矩阵:54.螺旋矩阵(Kotlin)
用递归方法求n的阶乘【C语言实现】
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/136614.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/20
1.8K0
用递归方法求n的阶乘【C语言实现】
n皇后问题c语言代码_求n的阶乘java代码
有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。例如,当n等于4时,有两种摆法。
全栈程序员站长
2022/11/11
1.6K0
n皇后问题c语言代码_求n的阶乘java代码
LeetCode 59. 螺旋矩阵 II && LeetCode 54. 螺旋矩阵
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
Michael阿明
2021/02/20
3210
LeetCode 59. 螺旋矩阵 II && LeetCode 54. 螺旋矩阵
python 生成随机矩阵_matlab建立m行n列矩阵
python中有两个模块可以生成随机数,该博客以的numpy模块为例进行生成随机数。(因为矩阵要生成大量的随机数据,故推荐使用numpy模块生成随机数)
全栈程序员站长
2022/11/01
1K0
54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 模拟 class Solution { public List<Integer> spir
CaesarChang张旭
2021/06/01
4020
54. 螺旋矩阵
LeetCode - #54 螺旋矩阵
我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。
Swift社区
2022/07/05
3140
LeetCode - #54 螺旋矩阵
螺旋矩阵||+相关练习
 59. 这题第一眼看上去确实有些害怕,但仔细分析之后就会发现它并没有那么可怕 解此题的关键在于,分清区间。  都为左闭右开 这样就好解决啦! 我们可以用四个循环实现螺旋状态。 class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组 int startx
亦小河
2022/11/14
3530
螺旋矩阵你听过?
昨天满课,我还是坚持来刷题了,写文时间是晚上10点45,刷题时间是10点,今日题目leetcode上的螺旋矩阵,这道题思路简单,实现困难,,对于考研的同学建议仔细看看,因为我们考研复试考了的。。。
公众号guangcity
2019/09/20
4160
螺旋矩阵你听过?

相似问题

用n个元素填充n*n矩阵

32

用向量[n,]填充逻辑矩阵[r,n]

217

遍历n*n矩阵的c程序

25

N由N个螺旋矩阵(1到平方(N))-意外输出

12

从中心以螺旋形式填充矩阵

28
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文