题目
本题是谭浩强《C程序设计课后习题》第6章第8题。
题目:找出一个2维数组中的鞍点:该位置上的元素在该行最大,在该列上最小,也可能没有鞍点。
例子:
9 6 8 70
10 23 55 66
15 67 4 69
其中66为鞍点并且唯一。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
1.我们采用3重for循环来进行遍历:
第一个for循环用于行数的循环次数
第二个for循环用于寻找到当前行最大的元素,循环范围是0-3
第三个for循环用于寻找该最大元素里的列最大元素,循环范围0-2;
2.定义flag,初值为0,是状态变量,当行最大元素=列最大元素时将其设为1,如果循环结束,flat依然等于0的话,就输出没有鞍点。
3.下面开始写具体的代码实现:本题的数组范围采用二维数组a[3][4],用户输入的方式。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
int main() {
int i, j, p;
int flat = 0;//定义flag,初值为0,是状态变量,当行最大元素=列最大元素时将其设为1,如果循环结束,flat依然等于0的话,就输出没有鞍点。
int a[3][4] = { 0 };
int max = 0;
printf("请输入一个3行4列的二维数组:\n");
for (i = 0; i <= 2; i++)
for (j = 0; j <= 3; j++)
scanf("%d", &a[i][j]);
for (i = 0; i <= 2; i++)
{
max = a[i][0];
for (j = 0; j <= 3; j++)
{
if (max < a[i][j])
//判断是否为该行最大的元素,不是的话拿其值并存其列号,以便于寻找是否为该列最小元素。
{
max = a[i][j];
p = j;
}
}
for (j = 0; j <= 2; j++)
{
if (max > a[j][p])
//判断是否为该列最小,如果大于任何一个元素就不是最小了,直接退出循环。
{
break;
}
}
if (j == 3)
{
printf("----------已经找到鞍点,为:%d------------\n", a[i][p]);
flat = 1;
break;
}
}
if (flat == 0)
{
printf("没有鞍点。");
}
printf("你输入的数组为:\n");
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= 3; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
三、执行结果
输入:
9 6 8 70
10 23 55 66
15 67 4 69
输出:
----------已经找到鞍点,为:66------------
你输入的数组为:
9 6 8 70
10 23 55 66
15 67 4 69