云分享 Share

某行上数据最大的元素,在元素所在列,该元素同时也是最小,这样的点就是鞍点。不过要考虑特殊情况,就是全是同一个数字的时候,这时没有鞍点。

1476455392126526.png

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
             #include <stdio.h>
int isFind(int data[20][20] , int m , int n)
{
   int maxH , i , j , line , flag , k;
   for(i = 0 ; i < m ; i++)
   {
       maxH = data[i][0];
       flag = 0;
       line = 0;
       for(j = 0 ; j < n ; j++ )
       {
            if(data[i][j] > maxH)
            {
                maxH = data[i][j];
                line = j;
            }
       }
 
       for(k = 0 ; k < m ; k++)
       {
           if(data[k][line] <= maxH && k != i)//特殊情况处理,如上图全是1的情况,k!=i要保证值相等时不是本身
           {
                flag = -1;
                break;
           }
       }
       
       if(flag == 0)
       {
           break;
       }
   }
 
   if(flag == -1)
   {
      return -1;
   }
   else
   {
       return maxH;
   }
}
 
 
void input(int m , int n , int data[20][20])
{
    int i , j;
    for(i = 0 ; i < m ; i++)
    {
       for(j = 0; j < n ; j++)
       {
            scanf("%d",&data[i][j]);
       }
    }
}
 
int main()
{
    int data[20][20];
    int m , n ,i = 1;
    while(scanf("%d %d",&m, &n) != EOF)
    {
        int point;
        if(m == 0 && n == 0)
        {
           break;
        }
        input(m,n,data);
        point = isFind(data,m,n);
        if(point != -1)
        {
           printf("Case %d: %d\n",i,point);
        }
        else
        {
            printf("Case %d: No\n",i);
        }
        i++;
    }
    return 0;
}
   返回