c语言T组矩阵问题,各位怎么做的啊?

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个正整数n(n≤20)当n=3时,排列顺序如下:
421
753
986

img

希望对你有帮助!代码仅供参考,谢谢!

img

img

img

img

#include <stdio.h>

void madeData(int n)
{
    int arr[n][n];
    int a = 1;

    //中线上部填数
    for (int j = n - 1, i = 1; j >= 0; j--, i++ /*j列控制,i控制每次填数个数*/)
    {
        for (int k = 0, x = 0, y = j; k < i; k++, x++, y++ /*行控制*/)
        {
            arr[x][y] = a++;
        }
    }

    //中线下部填数
    for (int i = n - 1, j = 1; i > 0; i--, j++ /*j行控制,i控制每次填数个数*/)
    {
        for (int k = 0, x = j, y = 0; k < i; k++, x++, y++ /*行控制*/)
        {
            arr[x][y] = a++;
        }
    }

    //输出
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%5d", arr[i][j]);
        }
        puts("");
    }
}

int main(int argc, char *argv[])
{
    int T;
    scanf("%d", &T);

    int arrn[T];

    for (int i = 0; i < T; i++)
    {
        scanf("%d", &arrn[i]);
    }

    //puts("");
    for (int i = 0; i < T; i++)
    {
        madeData(arrn[i]);
        //puts("");
    }

    return 0;
}

#include <stdio.h>

int main() {
    int t; // 测试数据组数
    scanf("%d", &t);

    while (t--) { // 循环读取每组测试数据
        int n; // 矩阵维度
        scanf("%d", &n);

        int matrix[20][20]; // 定义一个20x20的二维数组存储矩阵

        // 读取矩阵数据
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &matrix[i][j]);
            }
        }

        // 输出矩阵的转置
        printf("Matrix %d:\n", t+1);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                printf("%d ", matrix[j][i]);
            }
            printf("\n");
        }
    }

    return 0;
}

以上代码首先读取测试数据的组数t,然后使用while循环读取每组测试数据。在每组测试数据中,首先读取矩阵的维度n,并使用二维数组存储矩阵数据。然后,根据题目要求,输出矩阵的转置。最后,继续进行下一组测试数据的读取和处理。

该回答引用ChatGPT

这段代码中,我们先读入测试数据组数 t,然后使用 for 循环依次读入每组数据。对于每组数据,我们首先读入矩阵的大小 n,然后读入一个 n × n 的矩阵,并将其存储在一个二维数组 matrix 中。

接下来,我们按照题目给出的规律对矩阵进行重新排列。我们使用一个方向数组来记录当前位置的移动方向,初始方向为向右。然后,我们从 1 开始往矩阵中填入数字,每次填入一个数字后根据当前方向和下一个位置的情况来确定下一个位置和方向。如果下一个位置超出了矩阵的范围或者已经填过数字了,就需要改变方向。


using System;

public class Program
{
    public static void Main()
    {
        int t = int.Parse(Console.ReadLine());

        for (int i = 0; i < t; i++)
        {
            int n = int.Parse(Console.ReadLine());
            int[,] matrix = new int[n, n];

            for (int j = 0; j < n; j++)
            {
                string[] line = Console.ReadLine().Split();
                for (int k = 0; k < n; k++)
                {
                    matrix[j, k] = int.Parse(line[k]);
                }
            }

            int[] dx = { 1, 0, -1, 0 }; // 方向数组
            int[] dy = { 0, 1, 0, -1 };
            int dir = 0; // 当前方向
            int x = 0, y = 0; // 当前位置

            for (int j = 1; j <= n * n; j++)
            {
                matrix[x, y] = j;
                int nx = x + dx[dir];
                int ny = y + dy[dir];

                if (nx < 0 || nx >= n || ny < 0 || ny >= n || matrix[nx, ny] != 0)
                {
                    dir = (dir + 1) % 4;
                    nx = x + dx[dir];
                    ny = y + dy[dir];
                }

                x = nx;
                y = ny;
            }

            for (int j = 0; j < n; j++)
            {
                for (int k = 0; k < n; k++)
                {
                    Console.Write(matrix[j, k] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}
using System;

public class Program
{
    public static void Main()
    {
        int t = int.Parse(Console.ReadLine());

        for (int i = 0; i < t; i++)
        {
            int n = int.Parse(Console.ReadLine());
            int[,] matrix = new int[n, n];

            for (int j = 0; j < n; j++)
            {
                string[] line = Console.ReadLine().Split();
                for (int k = 0; k < n; k++)
                {
                    matrix[j, k] = int.Parse(line[k]);
                }
            }

            int[] dx = { 1, 0, -1, 0 }; // 方向数组
            int[] dy = { 0, 1, 0, -1 };
            int dir = 0; // 当前方向
            int x = 0, y = 0; // 当前位置

            for (int j = 1; j <= n * n; j++)
            {
                matrix[x, y] = j;
                int nx = x + dx[dir];
                int ny = y + dy[dir];

                if (nx < 0 || nx >= n || ny < 0 || ny >= n || matrix[nx, ny] != 0)
                {
                    dir = (dir + 1) % 4;
                    nx = x + dx[dir];
                    ny = y + dy[dir];
                }

                x = nx;
                y = ny;
            }

            for (int j = 0; j < n; j++)
            {
                for (int k = 0; k < n; k++)
                {
                    Console.Write(matrix[j, k] + " ");
                }
                Console.WriteLine();
            }
        }
    }
}



#include <stdio.h>

int main() {
    int T, n, i, j, k;
    scanf("%d", &T); // 输入测试数据的组数
    while (T--) {
        scanf("%d", &n); // 输入矩阵的维数
        int matrix[20][20]; // 定义矩阵
        k = 1;
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                matrix[i][j] = k++; // 按顺序填充矩阵
            }
        }
        // 调整矩阵顺序
        for (i = 0; i < n / 2; i++) {
            for (j = 0; j < n; j++) {
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = tmp;
            }
        }
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                printf("%d ", matrix[i][j]); // 输出矩阵元素
            }
            printf("\n");
        }
    }
    return 0;
}

程序中,首先输入测试数据的组数T,然后用while循环进行T次测试,每次输入矩阵的维数n,创建一个二维数组matrix来存储矩阵的元素,按顺序填充矩阵,然后通过两次循环交换矩阵的上下行,最后输出矩阵的元素。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这道题可以通过模拟矩阵构造的过程来解决。构造方法如下:

  1. 创建一个 $n \times n$ 的二维数组 mat,用于存储最终的矩阵。
  2. 从左上角开始,按照从上到下、从左到右的顺序依次填入 $1, 2, \ldots, n^2$。
  3. 在填数的过程中,用变量 x 和 y 记录当前填数的位置。初始值为 (0, 0)。
  4. 在填数时,如果当前位置 (x, y) 上已经填入了数,则将 x 和 y 分别加 1,并将当前位置变为 (x+1, y)。
  5. 如果当前位置超出了矩阵边界,则将 x 和 y 分别减 1,并将当前位置变为 (x, y-1)。

以下是完整的 C 语言代码实现,包括读入 T 和 n,以及输出构造好的矩阵:

#include <stdio.h>

#define MAX_N 20

int mat[MAX_N][MAX_N];

int main() {
    int T;
    scanf("%d", &T);

    while (T--) {
        int n;
        scanf("%d", &n);

        int x = 0, y = 0;
        for (int i = 1; i <= n * n; i++) {
            mat[x][y] = i;

            // 如果下一个位置已经有数了,改变方向
            if (x - 1 < 0 || mat[x-1][y] != 0) {
                // 向右
                if (y + 1 < n && mat[x][y+1] == 0) {
                    y++;
                }
                // 向下
                else {
                    x++;
                }
            }
            else {
                // 向上
                x--;
            }
        }

        // 输出矩阵
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                printf("%d ", mat[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

这段代码可以处理多组测试数据,每次输入一个正整数 $n$,然后构造出一个 $n \times n$ 的矩阵并输出。在实现中,我们使用一个二维数组 mat 来存储矩阵,用两个变量 x 和 y 记录当前填数的位置。在填数的过程中,我们根据当前位置和矩阵边界来判断下一个数的填充方向,并在变量 x 和 y 上相应地做出调整。最后,我们输出构造好的矩阵即可。