2022秋季C语言专题实验04-二维数组

1 找鞍点

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE

#include<stdio.h>
#include<math.h>
struct an
{
    int h;
    int l;
};//自定义结构体类型数据,保存行和列
int main()
{
    int a,i,j,k=0;
    scanf("%d",&a);
    int b[a][a];
    for(i=0;i<a;i++)
        for(j=0;j<a;j++)
            scanf("%d",&b[i][j]);
    struct an ma[a],mi[a];//定义两个数组分别保存每一行的最大值和每一列的最小值的位置
    for(i=0;i<a;i++)
    {
        int max=b[i][0];
        for(j=0;j<a;j++)//循环保存每一行的最大值的行、列值
        {
            if(b[i][j]>=max)
            {
                max=b[i][j];
                ma[i].h=i;
                ma[i].l=j;
            }
        }
    }
    for(i=0;i<a;i++)//循环保存每一列的最小值的行、列值
    {
        int min=b[0][i];
        for(j=0;j<a;j++)
        {
            if(b[j][i]<=min)
            {
                min=b[j][i];
                mi[i].h=j;
                mi[i].l=i;
            }
        }
    }
    for(i=0;i<a;i++){
        for(j=0;j<a;j++){
            if(ma[i].h==mi[j].h&&ma[i].l==mi[j].l)
            {
                printf("%d %d",ma[i].h,ma[i].l);
                k++;
                break;//找出一个鞍点即可
            }//如果在两个数组中保存的位置有相同的,那么表示就是鞍点
        }
    }
    if(k==0)
        printf("NONE");
}

2 刮刮彩票

“刮刮彩票”是一款网络游戏里面的一个小游戏。
每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 3×3 的“九宫格”形式排布在彩票上。

在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 3 横、3 竖、2 斜共 8 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。

数字合计获得金币数字合计获得金币
6100001672
73617180
872018119
93601936
108020306
11252211080
1210822144
1372231800
1454243600
15180

现在请你写出一个模拟程序,模拟玩家的游戏过程。

输入格式:
输入第一部分给出一张合法的彩票,即用 3 行 3 列给出 0 至 9 的数字。0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。

第二部给出玩家刮开的三个位置,分为三行,每行按格式 x y 给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。

最后一部分给出玩家选择的方向,即一个整数: 1 至 3 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7、8分别表示左上到右下的主对角线和右上到左下的副对角线。

输出格式:
对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。

输入样例:

1 2 3
4 5 6
7 8 0
1 1
2 2
2 3
7

输出样例:

1
5
6
180

#include<stdio.h>
int main()
{
int i,j,a[4][4],sum=0,k[10]={0},temp=0,choice,x,y;
int money[19]={10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
for(i=1;i<4;i++)//由题意下标从1开始
    for(j=1;j<4;j++)
    {
        scanf("%d",&a[i][j]);
        k[a[i][j]]=1;//将输入的数记为1
    }
for(i=1;i<10;i++)//9个数中找出初始时能看见的那个数
    if(k[i]==0)
        temp=i;
for(i=1;i<4;i++)//找出后,记录0背后真实的数字
    for(j=1;j<4;j++)
    {
        if(a[i][j]==0)
          a[i][j]=temp;
    }  
for(i=0;i<3;i++)
{
    scanf("%d %d",&x,&y);
    printf("%d\n",a[x][y]);
}
scanf("%d",&choice);
    if (choice <= 3)
        sum += a[choice][1] + a[choice][2] + a[choice][3];
	else if (choice > 3 && choice <= 6)
        sum += a[1][choice - 3] + a[2][choice - 3] + a[3][choice - 3];
	else if (choice == 7)
        sum += a[1][1] + a[2][2] + a[3][3];
    else if (choice == 8)
        sum += a[1][3] + a[2][2] + a[3][1];
    printf("%d\n",money[sum - 6]);//数字合计从6开始,减6就是对应的金币下标

    return 0;
}

7-3 矩阵运算

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

输出样例:

35

#include<stdio.h>
int main()
{
    int n,i,j,sum=0,t=0;
    scanf("%d",&n);
    int a[n][n];
     for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
            sum+=a[i][j];//先求总和
        }
     for(i=0;i<n;i++)//利用循环求最后一行、最后一列、以及剩下中间副对角线的和
        for(j=0;j<n;j++)
        {
            if(i==n-1||j==n-1||(i+j)==n-1)
                t+=a[i][j];
        }
    printf("%d",sum-t);
    return 0;
}

7-4 判断上三角矩阵

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

输入样例:

3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6

输出样例:

YES
NO
NO

#include<stdio.h>
int main()
{
    int t,n,i,j,k;
    scanf("%d",&t);
    for(k=0;k<t;k++)
    {
        int count=0;
        scanf("%d",&n);
        int a[n][n];
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                scanf("%d",&a[i][j]);
        for(i=1;i<n;i++)//循环求出下三角为0的个数
            for(j=0;j<i;j++)//判断第i行为0的数
                if(a[i][j]==0)
                    count++;
		if(count==(n*(n-1))/2)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

7-5 求矩阵的局部极大值

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:

4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1

输出样例1:

9 2 3
5 3 2
5 3 4

输入样例2:

3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1

输出样例2:

None 3 5


#include<stdio.h>
 
int main()
{
    int m,n,k=0;
    scanf("%d %d",&m,&n);
    int arr[m][n];
    //输入
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    
    //遍历时判断
    for(int i=1;i<m-1;i++)
    {
        for(int j=1;j<n-1;j++)
        {
            //循环判断这个数大于前后上下的数
            if(arr[i][j]>arr[i][j-1]&&arr[i][j]>arr[i][j+1]&&arr[i][j]>arr[i-1][j]&&arr[i][j]>arr[i+1][j])
            {
                printf("%d %d %d\n",arr[i][j],i+1,j+1);
                k=1;
            }
        }
    }
    
    //如果无局部极大值就输出对应数据
    if(k==0)
    {
        printf("None %d %d",m,n);
    }
    return 0;
}

7-6 打印杨辉三角

本题要求按照规定格式打印前N行杨辉三角。

输入格式:
输入在一行中给出N(1≤N≤10)。

输出格式:
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。

输入样例:

6

输出样例:

     1
    1   1
   1   2   1
  1   3   3   1
 1   4   6   4   1    
1   5  10  10   5   1
#include<stdio.h>
int main()
{
    int N,k;
    scanf("%d",&N );
    int a[N][N],i,j;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            if(j==0||j==i)
                a[i][j]=1;
        }
    }
    for(i=2;i<N;i++)//计算除1以外的数并存入数组
        for(j=1;j<i;j++)
            a[i][j]=a[i-1][j-1]+a[i-1][j];
    //输出
    for(i=0;i<N;i++)
    {
        k=i; 
        while(N-k>1)
        {
            printf(" ");
            k++;
        }
        for(j=0;j<=i;j++)
            printf("%4d",a[i][j]);
        printf("\n");
    }
    return 0;
} 

7-7 矩阵A乘以B

给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有 R a R_{a} Ra行、 C a C_{a} Ca列,B有 R b R_{b} Rb行、 C b C_{b} Cb列,则只有 C a C_{a} Ca R b R_{b} Rb相等时,两个矩阵才能相乘。

输入格式:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。

输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。

输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

输出样例2:

Error: 2 != 3


#include<stdio.h>
int main()
{
    int ra,ca,rb,cb,i,j;
    //输入A B
    scanf("%d %d",&ra,&ca);
    //输入矩阵A
    int a[ra][ca];
    for(i=0;i<ra;i++)
        for(j=0;j<ca;j++)
            scanf("%d",&a[i][j]);
    scanf("%d %d",&rb,&cb);
    //输入矩阵B
    int b[rb][cb];
    for(i=0;i<rb;i++)
        for(j=0;j<cb;j++)
            scanf("%d",&b[i][j]);
            
    if(ca==rb)
    {
        int k;
        printf("%d %d\n",ra,cb);
        for(i=0;i<ra;i++)//乘积矩阵行
        {
            for(k=0;k<cb;k++)//循环输出乘积矩阵每一行的值
            {
                if(k!=cb-1)
                {
                    int sum=0;
                    for(j=0;j<ca;j++)//乘积的计算方法
                        sum+=a[i][j]*b[j][k];
                    printf("%d ",sum); 
                }
                else//输出每行最后一个,没有空格
                {
                    int sum=0;
                    for(j=0;j<ca;j++)
                        sum+=a[i][j]*b[j][k];
                    printf("%d",sum); 
                }
            }
            printf("\n");
        }
    }
    else
        printf("Error: %d != %d",ca,rb);
    return 0;
}

7-8 矩阵列平移

给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的偶数列的元素整体向下依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。

输入格式:
输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。

接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。

输出格式:
在一行中输出平移后第 1 到 n 行元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

7 2 99
11 87 23 67 20 75 89
37 94 27 91 63 50 11
44 38 50 26 40 26 24
73 85 63 28 62 18 68
15 83 27 97 88 25 43
23 78 98 20 30 81 99
77 36 48 59 25 34 22

输出样例:

440 399 369 421 302 386 428

样例解读

需要平移的是第 2、4、6 列。给定 k=2,应该将这三列顺次整体向下平移 1、2、1 位(如果有更多列,就应该按照 1、2、1、2 …… 这个规律顺次向下平移),顶端的空位用 99 来填充。平移后的矩阵变成:

11 99 23 99 20 99 89
37 87 27 99 63 75 11
44 94 50 67 40 50 24
73 38 63 91 62 26 68
15 85 27 26 88 18 43
23 83 98 28 30 25 99
77 78 48 97 25 81 22

#include<stdio.h>
int main(void) {
	int n, k, x;
	scanf("%d %d %d", &n, &k, &x);
	int num[101][101];
	int i, j;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			scanf("%d", &num[i][j]);
		}
	}
	int m = 1, count = 0;
	for (j = 1; j < n; j += 2) {
		count = m;
		m++;
		if (m > k) {
			m = 1;
		}
		for (i = n - 1; i >= 0; i--) {
			num[i][j] = num[i-count][j];
			if (i < count) {
				num[i][j] = x;
			}
		}
	}
	 	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum = 0;
		for (int j = 0; j < n; j++) {
			sum += num[i][j];
		}
		printf("%d", sum);
		if (i < n - 1) {
			printf(" ");
		}
	}
    
	return 0;
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值