版权声明:本人原创文章若需转载请标明出处和作者!沙沙 https://blog.csdn.net/weixin_44143702/article/details/86526946
鞍点计算
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。同一行和同一列没有相同的数。
Input
输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。
Output
按下列格式输出鞍点:
Array[i][j]=x
其中,x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。
一个二维数组并不一定存在鞍点,此时请输出None。
我们保证不会出现两个鞍点的情况,比如:
3 3
1 2 3
1 2 3
3 6 8
Sample Input
3 3 1 2 3 4 5 6 7 8 9
Sample Output
Array[0][2]=3
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int m, n, i, j, x, y, k, flag, max, min;
//max 的定义以及其他数据的定义都要定义在最外面的括号中,它们的作用域只在其后面的括号
int a[11][11];
scanf("%d %d", &m, &n);
memset(a, 0, sizeof(a));
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
x = y = 0;//定义x和y用于存储每行最大值所在i和j,开始要清零
for(i = 0; i < m; i++)
{
max = a[i][0];//max的重置放在列筛选外面,行筛选里面
for(j = 0; j < n; j++)
{
if(max <= a[i][j])
{
max = a[i][j];
x = i;
y = j;
}//筛选每行最大的值并分别记录它的i和j到x和y
}
min = a[x][y];//定义min,假设该列的最小数为a[x][y]
flag = 1;
for(k = 0; k < m; k++)
{
if(min > a[k][y]) flag = 0;
}//如果a[x][y]不是该列最小的数,则flag = 0,继续循环到下一行
if(flag) break;//如果该数就是在该行最大且在该列最小,则结束循环
}
if(flag) printf("Array[%d][%d]=%d\n", x, y, a[x][y]);
else printf("None\n");
return 0;
}