前言
注意:如果读者使用的译器是Visual Studio的话则需要在第一行添加如下代码,否则使用scanf函数会报错。
这段代码考虑到了找鞍点过程中存在的所有情况(弥补了那些考虑不周的bug),这里例举的是四行四列的矩阵,读者如有需求可自行修改第二,三行M(行数),N(列数)的值。
输入输出示例:
这里需要考虑三种输入情况
1.没有鞍点的情况
1 5 6 9
1 4 7 8
5 9 3 4
4 8 5 2
No
2.有一个或一个以上鞍点的情况(不包含全是鞍点的情况)
3 3 1 0
4 4 1 1
5 5 1 1
6 6 1 1
第1行第1列为鞍点且数值大小为:3
第1行第2列为鞍点且数值大小为:3
3.输入的数全部相等(全是鞍点的情况)
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
以上的数全是鞍点!
一、什么是鞍点?
元素值在该行上最大,在该列上最小,对应的即为鞍点。
二,答案
1.注意
如果读者使用的译器是Visual Studio的话则需要在第一行添加如下代码,否则使用scanf函数会报错。
#define _CRT_SECURE_NO_WARNINGS 1
2.源代码
#define _CRT_SECURE_NO_WARNINGS 1
#define M 4
#define N 4
#include<stdio.h>
int main()
{
printf("请输入%d行%d列数字:\n", M, N);
int a[M][N], b, c, d, e, f, n, g, i, j, k, l, m = 0, x=2;
for (b = 0; b < M; b++) {//给数组赋值
for (c = 0; c < N; c++) {
scanf("%d", &a[b][c]);
}
}
//n = a[g][0]; d = a[0][f];
for (g = 0; g < M; g++) {
f = 0;
e = 0;
n = a[g][0];
for (c = 0; c < N; c++) {//找出g+1行的最大值及其所在的列f+1
if (a[g][c] > n) {
n = a[g][c];
f = c;;
}
}
d = a[0][f];
for (c = 0; c < M; c++) {//找出f+1列的最小值并判断其所在的行
if (a[c][f] < d) {
d = a[c][f];
e = c;
}
}
for (i = 0; i < M; i++) {
for (c = 0; c < M; c++) {
if (a[0][0] == a[i][c]) { m++; }//给判断是否输入的数全部相等(全是鞍点的情况)创造判断条件
}
}
if (e == g) {//判断行的最大值和所对应列的最小值是否为同一个数(同一地址)
for (i = 0; i < M; i++) {
if (a[g][f] == a[g][i]) {
k = a[0][i];
for (j = 0; j <= M; j++) {
if (a[j][i] < k) {
d = a[j][i];
l = j;
}
else if (m == M * M) {//所有都相等的情况
printf("以上的数全是鞍点!");
x = 0;
goto y;
}
if (j == e) { //有一个或一个以上鞍点的情况(不包含全是鞍点的情况)
printf("第%d行第%d列为鞍点且数值大小为:%d\n", g + 1, i + 1, a[e][f]);
x = 0; }
}
}
}
}
y: break;
}
if (x == 2) { printf("No"); }//没有鞍点的情况
return 0;
}
总结
这段代码算相对初学者而言可能需要多花点时间才易搞清楚,关于代码的核心部分讲解博主已给出注释,如有疑惑可在评论区留言。