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