c 中的螺旋矩阵图案?

问题描述 投票:0回答:1

尝试以这种模式以螺旋形式填充矩阵,并在测试中遇到问题,任何人都可以帮助我吗?我尝试过的代码和想法如下..

创建以下程序:用户首先输入整数矩阵(不大于100)的宽度S和高度V。然后用户输入整数 X 和 Y。

矩阵应填充数字X和Y,如下所示:在矩阵的中间,即坐标[S/2,V/2]处,有数字X(如果坐标为X,则解被识别)中心的偏差与预期值相差 1)。然后用数字 X 螺旋地填充矩阵,首先向左,然后向下,然后向右,然后向上,等等。在这些螺旋之间,为数字 Y 留出空间。S 的矩阵布局示例=9, V=7, X=4 和 Y= 6 如下:

6 6 6 6 6 6 6 6 4
4 4 4 4 4 4 4 6 4
4 6 6 6 6 6 4 6 4
4 6 4 4 4 6 4 6 4
4 6 4 6 6 6 4 6 4
4 6 4 4 4 4 4 6 4
4 6 6 6 6 6 6 6 4

矩阵中心的元素用粗体标记。完成的矩阵应在最后打印在屏幕上。

#include <stdio.h>

int main() {
    int matrica[100][100], i, j, s, v, x, y;

    printf("Unesite sirinu i visinu matrice: ");
    scanf("%d%d", &s, &v);
    printf("Unesite X i Y: ");
    scanf("%d%d", &x, &y);

    int br = 2;
    int poc_i = s / 2;
    int poc_j = v / 2;
    int ind = 1;
    while (poc_i < v && poc_j < v) {
        for (int i = 0; i < br; i++) {
            matrica[poc_i][poc_j] = x;
            if (ind % 2 != 0) {
                poc_j--;
            } else {
                poc_j++;
            }
        }
        for (int i = 0; i < br; i++) {
            matrica[poc_i][poc_j] = x;
            if (ind % 2 != 0) {
                poc_i++;
            } else {
                poc_i--;
            }
        }
        br += 2;
        ind++;
    }

    for (int i = 0; i < s; i++) {
        for (int j = 0; j < v; j++) {
            if (matrica[i][j] != x) {
                matrica[i][j] = y;
            }
        }
    }

    for (i = 0; i < v; i++) {
        for (j = 0; j < s; j++)
            printf("%5d", matrica[i][j]);
        printf("\n");
    }
    return 0;
}
c loops for-loop matrix spiral
1个回答
0
投票

这是代码的更新版本,可以正常工作。

#include <stdio.h>
#include <memory.h>

int main()
{
    int matrica[100][100], i, j, s, v, x, y, m;

    memset(matrica, 0, sizeof(matrica));

    printf("Unesite sirinu i visinu matrice: ");
    scanf("%d%d", &s, &v);
    printf("Unesite X i Y: ");
    scanf("%d%d", &x, &y);

    int br = 2;
    int poc_i = v / 2;
    int poc_j = s / 2;
    int ind = 1;
    m = (s > v ? s : v);
    while (poc_i < m && poc_j < m) {
        for (i = 0; i < br; i++) {
            if (0 <= poc_i && poc_i < v && 0 <= poc_j && poc_j < s) {
                matrica[poc_i][poc_j] = x;
            }
            if (ind % 2 != 0) {
                poc_j--;
            } else {
                poc_j++;
            }
        }
        for (i = 0; i < br; i++) {
            if (0 <= poc_i && poc_i < v && 0 <= poc_j && poc_j < s) {
                matrica[poc_i][poc_j] = x;
            }
            if (ind % 2 != 0) {
                poc_i++;
            } else {
                poc_i--;
            }
        }
        br += 2;
        ind++;
    }

    for (i = 0; i < v; i++) {
        for (j = 0; j < s; j++) {
            if (matrica[i][j] != x) {
                matrica[i][j] = y;
            }
        }
    }

    for (i = 0; i < v; i++) {
        for (j = 0; j < s; j++)
            printf("%5d", matrica[i][j]);
        printf("\n");
    }
    
    return 0;
}

运行此命令会根据示例输入值给出以下结果:

Unesite Sirinu i visinu 矩阵:9 7
Unesite X i Y:4 6

    6    6    6    6    6    6    6    6    4
    4    4    4    4    4    4    4    6    4
    4    6    6    6    6    6    4    6    4
    4    6    4    4    4    6    4    6    4
    4    6    4    6    6    6    4    6    4
    4    6    4    4    4    4    4    6    4
    4    6    6    6    6    6    6    6    4

如您所见,它符合您的要求。您的代码有几个错误,所以我做了以下更改:

  1. 您的

    matrica
    矩阵是在堆栈上分配的,因此默认情况下它包含随机值。但是,您后面的代码假设任何未分配
    x
    的内容都应设置为
    y
    。尽管不太可能,但某些未分配的值可能具有
    x
    值,因此无法正常工作。因此,我添加了行
    memset(matrica, 0, sizeof(matrica));
    将所有值设置为 0。这假设
    x
    永远不会为 0,因此如果情况并非如此,您可能希望更改此设置。

  2. 根据您输出结果的方式,您的记忆被设置为第一个索引是垂直位置,第二个索引是水平位置,这与正常情况相反。因此,我在初始化

    v
    s
    值的行中交换了
    poc_i
    poc_j
    值。

  3. 宽度和高度尺寸可能有很大不同,因此仅基于高度

    while
    v
    循环条件可能会过早退出。相反,我们想要使用这些值中的最大值,这是我使用
    m = (s > v ? s : v);
    线所做的。

  4. 用于设置

    matrica
    矩阵值的索引可能超出范围,因此我添加了检查以确保不会在主 while 循环中更新值的 2 个位置发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.