sdut oj C语言 鞍点计算

版权声明:本人原创文章若需转载请标明出处和作者!沙沙 https://blog.csdn.net/weixin_44143702/article/details/86526946

鞍点计算

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44143702/article/details/86526946