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

  • 1 找鞍点
  • 2 刮刮彩票
  • 7-3 矩阵运算
  • 7-4 判断上三角矩阵
  • 7-5 求矩阵的局部极大值
  • 7-6 打印杨辉三角
  • 7-7 矩阵A乘以B
  • 7-8 矩阵列平移

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 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。

数字合计 获得金币 数字合计 获得金币
6 10000 16 72
7 36 17 180
8 720 18 119
9 360 19 36
10 80 20 306
11 252 21 1080
12 108 22 144
13 72 23 1800
14 54 24 3600
15 180

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

输入格式:
输入第一部分给出一张合法的彩票,即用 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");elseprintf("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

输出样例:

     11   11   2   11   3   3   11   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 Bscanf("%d %d",&ra,&ca);//输入矩阵Aint 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);//输入矩阵Bint 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");}}elseprintf("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;
}

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

  1. 2022秋季C语言专题实验07

    2022秋季C语言专题实验07 指针应用-查找数组元素 请编写函数CHG(char *S) 7-1 秋天的第一杯奶茶 7-2 统计单词 7-3 找最大字符串 7-4 字符串排序 7-5 缩写期刊名 7 ...

  2. 2022秋季C语言专题实验03-一维数组

    2022秋季C语言专题实验03-一维数组 1 数组求平均值和小于等于平均值的实数个数 2 求最大值及其下标 3 交换最小值和最大值 4 分2列 5 求集合数据的均方差 6 斐波那契数列 7 计算平均分 ...

  3. 2022秋季C语言专题实验03一维数组

    2022秋季C语言专题实验03-一维数组 1 数组求平均值和小于等于平均值的实数个数 2 求最大值及其下标 3 交换最小值和最大值 4 分2列 5 求集合数据的均方差 6 斐波那契数列 7 计算平均分 ...

  4. PTA 2022秋季C语言专题实验07

    目录 6-1 指针应用-查找数组元素 6-2 请编写函数CHG(char *S) 7-1 秋天的第一杯奶茶 7-2 统计单词 7-3 找最大字符串 7-4 字符串排序 7-5 缩写期刊名 7-6 魔镜 ...

  5. LeetCode-剑指 Offer 04. 二维数组中的查找

    剑指 Offer 04. 二维数组中的查找 思路一:暴力解法,两层for循环查找 时间复杂度为:O(nm) 空间复杂度为:O(1) class Solution {public:bool findNu ...

  6. C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中

    C语言学习之将一个二维数组的行和列互换,存到另一个二维数组中 #include <stdio.h> int main(){int a[2][3]={{1,2,3},{4,5,6}}; // ...

  7. c语言中二维数组怎么,c语言中什么是二维数组

    c语言中什么是二维数组 二维数组A[m][n],这是一个m行,n列的二维数组.以下是由应届毕业生小编整理关于c语言二维数组的内容,希望对大家有所帮助!更多相关内容请关注应届毕业生考试 网. c语言的二 ...

  8. C语言错误c2063,请教C语言中关于将二维数组复制到一个三维数组的问题

    请教C语言中关于将二维数组复制到一个三维数组的问题 小白正在填写一段代码,是有点类似与俄罗斯方块的一段游戏代码,代码如下 要求在增加参数,变量和函数的情况下完成此代码,只能填写// write app ...

  9. 【LeetCode】剑指 Offer 04. 二维数组中的查找

    [LeetCode]剑指 Offer 04. 二维数组中的查找 文章目录 [LeetCode]剑指 Offer 04. 二维数组中的查找 package offer;public class Solu ...

最新文章

  1. DFA在C#中的实现:过滤敏感词
  2. 计算机在生命科学中的发展前景,往生命科学领域发展的职业前景
  3. Linux 使用ntpdate自动对时
  4. C/C++语言函数学习(1):atexit、exit、return
  5. Win7宽带连接错误678怎么办
  6. 怎样对付win7黑屏
  7. 两幅图的RGB+Depth点云拼接
  8. python爬取网易云音乐数据
  9. 再次回归 IDEA 的部分修改记录...
  10. oracle中todate函数实例,pl/sql to_date 函数使用实例讲解
  11. 【开源夏令营优秀开题报告】专题之三-云与大数据合集
  12. 动漫人脸识别技术及数据集介绍
  13. 职业规划-自动化测试
  14. 练习HTML——简单的网页设计
  15. 客户端访问https时应无浏览器(含终端)安全警告信息;_(多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗......
  16. 拨号盘拨号数字间距太小 调大 修改通讯录里面收藏和所有联系人字体颜色
  17. Markdown 编辑公式
  18. Linux重启命令shutdown与reboot
  19. 对于感情的一点小感悟
  20. 质量是企业的生命,如何破解质量管控难题?质量管理系统推荐

热门文章

  1. Centos 搜索命令 whereis 、which 、locate
  2. AAPT: error: unexpected element <queries> found in <manifest>.
  3. 如何删除我的电脑里的优酷影视库
  4. 2021年中国燃气表发展现状及进出口状况分析:随城镇化推进,燃气表市场规模有望扩大 [图]
  5. 做php段子,段子搬运工
  6. python 并发下载器
  7. CMMI3.0标准颁布,CMMI认证难度又提升了
  8. 【Bleak】三、扫描(指定设备地址)
  9. 窃密恶意软件通过仿冒盗版软件下载网站进行传播
  10. Python实现冒泡排序