一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的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
#include
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");
}
“刮刮彩票”是一款网络游戏里面的一个小游戏。
每次游戏玩家会拿到一张彩票,上面会有 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
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;
}
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式: 输出格式: 输入样例: 4 输出样例: 35 上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。 本题要求编写程序,判断一个给定的方阵是否上三角矩阵。 输入格式: 输出格式: 输入样例: 3 输出样例: YES 给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。 输入格式: 输出格式: 输入样例1: 4 5 输出样例1: 9 2 3 输入样例2: 3 5 输出样例2: None 3 5 本题要求按照规定格式打印前N行杨辉三角。 输入格式: 输出格式: 输入样例: 6 输出样例: 给定两个矩阵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相等时,两个矩阵才能相乘。 输入格式: 输出格式: 输入样例1: 2 3 输出样例1: 2 4 输入样例2: 3 2 输出样例2: Error: 2 != 3 给定一个 n×n 的整数矩阵。对任一给定的正整数 k 输入格式: 接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。 输出格式: 输入样例: 7 2 99 输出样例: 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
输入第一行给出正整数n(1
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
#include
7-4 判断上三角矩阵
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
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
NO
NO#include
7-5 求矩阵的局部极大值
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
5 3 2
5 3 4
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
#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(1≤N≤10)。
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include
7-7 矩阵A乘以B
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
20 22 24 16
53 58 63 28
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
#include
7-8 矩阵列平移
输入第一行给出 3 个正整数:n(<100)、k(
在一行中输出平移后第 1 到 n 行元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。
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
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