2023安全编程实践之C语言训练

多维数组与字符串

矩阵翻转输出

给定一个 m 行、n 列的矩阵,你需要根据要求将它水平翻转或竖直翻转。对于矩阵 A=[45​36​12​],如果我们对 AA 进行水平翻转,我们将得到 A' = [12​36​45​];如果我们对 AA 进行竖直翻转,我们将得到 A'' =[54​63​21​]。

输入格式

测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n(1001≤m,n≤100),两个整数之间用一个空格分隔。

接下来输入 m 行,每行包含 n 个整数,每两个整数之间用一个空格分隔。

接下来输入一行,输入一个整数为10。当输入为1时对矩阵进行水平翻转;当输入为0时对矩阵进行竖直翻转。

输出格式

输出包括 m 行,每行包含 n 个整数,按要求输出翻转后的矩阵,每行任意两个整数之间用一个空格分隔,每行最后一个整数后面没有空格。

样例输入1
2 3
1 2 3
3 4 6
1
样例输出1
3 2 1
6 4 3
#include <stdio.h>
int main() {
    int a[100][100];
    int m,k;
    int n,i,j;
    scanf("%d %d",&m,&n);
    for( i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d",&k);
      if(k == 1){
        for(i=0; i<m; i++){
            for(j=n-1; j>=0; j--){
                printf("%d", a[i][j]);
                if(j != 0)
                    printf(" ");
            }
            printf("\n");
        }
    }
    if(k == 0){
        for(i=m-1; i>=0; i--){
            for(j=0; j<n; j++){
                printf("%d", a[i][j]);
                if(j != n-1)
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

矩阵螺旋输出

给定一个 m 行、n 列的矩阵,请按照顺时针螺旋的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。

输入格式

测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n( 1001≤m,n≤100),之间用一个空格分隔。接下来输入 m 行,每行包含 n 个整数(−10000≤a,b,c≤10000),每两个整数之间用一个空格分隔。

输出格式

输出为一行,包括 m×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。

样例输入1

2 3

1 2 3
3 4 6

样例输出1

1 2 3 6 4 3

#include <stdio.h>
const int vis = 1000000000;
int nowx = 0, nowy = 0, dir = 0;
int step[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main() {
    int matrix[100][100];
    int m;
    int n;
    scanf("%d %d", &m, &n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
    for (int i = 0; i < m * n; i++) {
        if( i==m*n-1) printf("%d", matrix[nowx][nowy]);
        else printf("%d ", matrix[nowx][nowy]);//注意最后一个没有空格
        
        matrix[nowx][nowy] = vis;
        int nextx = nowx + step[dir][0];
        int nexty = nowy + step[dir][1];
        if (nextx < 0 || nextx >= m || nexty < 0 || nexty >= n || matrix[nextx][nexty] == vis) {
            dir = (dir + 1) % 4;
            nextx = nowx + step[dir][0];
            nexty = nowy + step[dir][1];
        }
        nowx = nextx;
        nowy = nexty;
    }
    return 0;
}

 

排兵布阵

蒜头将军准备布一个新的方阵队形,来抵御来自四面八方的敌人,如果已知每个士兵的武力值,请你帮他计算一下,在某次排兵布阵的过程中,最外层士兵们的武力值是多少。

输入格式

第一行分别为队伍的行数 m和列数 n(m < 100,n<100),两者之间以一个空格分开。

接下来输入的 m 行数据中,每行包含 n 个整数(取值范围为 [0, 9]),整数之间以一个空格分开,表示每个士兵的武力值。

输出格式

输出最外层士兵们的武力值。

格式说明

输出时每行末尾的多余空格,不影响答案正确性

样例输入

3 3

3 4 1

3 7 1

2 8 1

样例输出

23

#include <stdio.h>
int main() {
    int a[100][100];
    int m;
    int n,i,j;
    scanf("%d %d",&m,&n);
    for( i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
        int sum = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (i == 0 || i == m-1 || j == 0 || j == n-1) {
                sum += a[i][j];
            }
        }
    }

    printf("%d\n", sum);

    return 0;
}

中心矩阵

对于给定的整数 n,我们需要输出一个 n × n 的中心矩阵。中心矩阵的定义是最外层边界由 1 组成,然后是第二层边界由 2 组成,依次类推,直到中心部分为 n 组成。

样例输入 5,代码将输出如下中心矩阵:

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
#include <stdio.h>
int main() {
    int a[100][100];
    int n,i,j;
    scanf("%d",&n);
    int m=(n+1)/2;;
  for (int i = 0; i < m; i++) {
        for (int j = i; j < n - i; j++) {
            a[i][j] = i + 1;
            a[j][i] = i + 1;
            a[n - i - 1][j] = i + 1;
            a[j][n - i - 1] = i + 1;
        }
    }
       for ( i = 0; i < n; i++) {
        for ( j = 0; j < n; j++) {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

最大子矩阵

给定一个 m×n 的矩阵,1002≤m,n≤100。这个矩阵中包含着很多 2×2 的子矩阵。

那么在这些子矩阵当中,哪一个子矩阵的四个元素乘积最大呢?(数据保证答案唯一)

输入格式

输入为 m + 1行:

  • 第一行为两个整数 m 和 n,1002≤m,n≤100,为矩阵的行数和列数;
  • 接下来的 m 行中,每行为用空格隔开的 nn 个正整数,每个正整数的值不超过 10000。
输出格式

输出为 3 行:

  • 第一行是一个整数,为所有子矩阵四个元素乘积的最大值;
  • 接下来的两行,为四个元素乘积最大的 2×2 子矩阵,每行为用空格隔开的两个整数。

格式说明

输出时每行末尾的多余空格,不影响答案正确性

样例输入1
2 2
2 3
4 5
样例输出1
120
2 3
4 5
#include <stdio.h>
int main() {
    int m;
    int n;
    scanf("%d %d",&m,&n);
    long int a[m][n];//注意内存受限问题
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            scanf("%ld ",&a[i][j]);
        }
    }
    long long int max = 0;
    int row = 0, col = 0;
    for (int i = 0; i < m - 1; i++) {
        for (int j = 0; j < n - 1; j++) {
            long long int product = a[i][j] * a[i][j+1] * a[i+1][j] * a[i+1][j+1];
            if (product > max) {
                max = product;
                row = i;
                col = j;
            }
        }
    }
    printf("%lld\n", max);
    printf("%ld %ld\n", a[row][col], a[row][col + 1]);
    printf("%ld %ld\n", a[row + 1][col], a[row + 1][col + 1]);
    return 0;
}

矩阵蛇形输出

给定一个 m 行、n 列的矩阵,请按照下图所示的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。

 

注意 每次碰到边界后,必须且只能沿着边界移动一格,不能后退,不能超出边界;在非边界区域只能向右上或左下方向前进。

输入格式

测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n(1≤m,n≤100),之间用一个空格分隔。接下来输入 m 行,每行包含 n 个整数(−10000≤ 每个数≤10000),每两个整数之间用一个空格分隔。

输出格式

输出为一行,包括 m×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。

格式说明

输出时每行末尾的多余空格,不影响答案正确性

样例输入1
2 3
1 2 3
4 5 6
样例输出1

1 2 4 5 3 6

#include <stdio.h>

void print(int a[][1001], int m, int n) {
    int row = 0; // 当前行的索引
    int col = 0; // 当前列的索引
    int dir = 1; // 方向,1表示向上,-1表示向下
    for (int i = 0; i < m * n; i++) { // 通过循环控制打印次数,m * n为总的元素个数
        if(i==m*n-1) printf("%d", a[row][col]); 
        else printf("%d ",a[row][col]);//注意输出格式
        
        if (dir == 1) { // 当方向为向上时
            if (col == n - 1) { // 如果已经到达最右边一列
                row++; // 行加1,改为向下方向
                dir = -1;
            } else if (row == 0) { // 如果已经到达第一行
                col++; // 列加1,改为向下方向
                dir = -1;
            } else {
                row--; // 行减1,继续向上方向
                col++; // 列加1
            }
        } else { // 当方向为向下时
            if (row == m - 1) { // 如果已经到达最下面一行
                col++; // 列加1,改为向上方向
                dir = 1;
            } else if (col == 0) { // 如果已经到达第一列
                row++; // 行加1,改为向上方向
                dir = 1;
            } else {
                row++; // 行加1,继续向下方向
                col--; // 列减1
            }
        }
    }
}

int main() {
    int m, n;
    scanf("%d %d", &m, &n); // 输入矩阵的行数和列数
    int a[1001][1001]; // 定义矩阵数组
    // 输入矩阵的元素
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    print(a, m, n); // 调用打印函数
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值