
编写程序,找出二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。要求使用C语言,不是C++
设计思路:
使用两个相同的二维数组,一个存数据,一个存是鞍点的可能性,可能性若为0,则不是鞍点;若为1,则不是鞍点,但是行最大数或者列最小数;若为2,则是鞍点;
首先,获取每行最大数,并赋给max,并将改行中与max相等的数是鞍点的可能性设为1,其他数的可能性设为0;
其次,获取每列最小数,并赋给min,并将该列中与min相等的数是鞍点的可能性增加1;
最后,判断每个数是鞍点的可能性,若是2,则是鞍点,输出。
流程图自己画吧
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROW 3
#define COL 3
void main()
{
int a[ROW][COL];
int flag[ROW][COL]; //记录每个元素是鞍点的可能性,
int i, j, max, min, count=0;
printf("输入数组内容(%d行%d列):\n", ROW, COL);
for (i=0; i<ROW; i++)
{
for (j=0; j<COL; j++)
{
scanf("%d", &a[i][j]);
}
}
for (i=0; i<ROW; i++) //查找每行最大数, 并设置每个数是鞍点的可能性
{
max = a[i][0];
for (j=1; j<COL; j++)
{
max = (max < a[i][j])?a[i][j]:max;
}
for (j=0; j<COL; j++)
{
if (a[i][j] == max)//若是最大数,则鞍点可能性设为1,否则为0
flag[i][j] = 1;
else
flag[i][j] = 0;
}
}
for (j=0; j<COL; j++) //查找每列最小数,并设置每个数是鞍点的可能性
{
min = a[0][j];
for (i=1; i<ROW; i++)
{
min = (min > a[i][j])?a[i][j]:min;
}
for (i=0; i<ROW; i++)
{
if (a[i][j] == min)//若是最小数,则鞍点可能性增加1
{
flag[i][j]++;
count++;
}
}
}
printf("鞍点个数为:%d \n", count);
for (i=0; i<ROW; i++) //输出鞍点信息
{
for (j=0; j<COL; j++)
{
if (flag[i][j] == 2)
printf("%d, (%d行%d列)\n", a[i][j], i, j);
}
}
return;
}
#include <stdio.h>
#define ROW 3
#define COL 3
int main() {
int arr[ROW][COL] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int rowMax, colMin, flag;
for (int i = 0; i < ROW; i++) {
rowMax = 0;
flag = 1;
for (int j = 0; j < COL; j++) {
if (arr[i][j] > arr[i][rowMax]) {
rowMax = j;
}
}
colMin = 0;
for (int k = 0; k < ROW; k++) {
if (arr[k][rowMax] < arr[colMin][rowMax]) {
colMin = k;
}
}
if (colMin == i) {
printf("鞍点坐标:(%d, %d)\n", i, rowMax);
flag = 0;
}
}
if (flag) {
printf("该二维数组不存在鞍点。\n");
}
return 0;
}
程序中,首先定义了一个 $3 \times 3$ 的二维数组 arr 作为样例数据。接着,程序使用两个变量 rowMax 和 colMin 记录当前行的最大值和当前列的最小值,再用一个变量 flag 标志是否存在鞍点。接下来,程序使用两个嵌套的 for 循环遍历数组,分别找到每一行的最大值和每一列的最小值,并判断当前列的最小值是否等于当前行的最大值,如果等于,就说明找到了一个鞍点。最后,程序通过 flag 变量判断是否存在鞍点,如果不存在,就输出一个提示信息。