1190 - C语言7.14
找出一个二维数组中的所有鞍点,即该位置上的元素在该行中最大但是在该列中最小。需要注意有可能鞍点不存在,此时需要输出“NO”。
题目输入
第一行有2个正整数n和m,表示二维数组的高度和宽度,保证n和m均不超过50。
之后的n行每行有m个用空格隔开的整数,表示二维数组对应位置的值。
题目输出
当鞍点存在时,将每个鞍点的信息在一行内输出,输出三个用空格隔开的整数,分别为鞍点元素的值以及其所在的行号和列号,有多个鞍点时,按照元素读入的顺序进行输出。当鞍点不存在时,在一行内输出“NO”。
请注意不需要输出引号,并请注意行尾输出换行。
输入/输出样例
题目输入
2 3 23 83 15 99 98 97
题目输出
83 0 1
C语言解答
#include<stdio.h> int main(){ int n,m,tag; int i,j,k,maxi; int a[50][50]; scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&a[i][j]); for(i=0;i<n;i++){ tag=1; maxi=0; for(k=0;k<m;k++){ if(a[i][maxi]<a[i][k]) maxi=k; } for(j=0;j<n;j++){ if(a[i][maxi]>a[j][maxi]) tag=0; } if (tag==1) printf("%d %d %d\n",a[i][maxi],i,maxi); } return 0; }
C++解答
#include <stdio.h> int main() { int dat[50][50]; int n, m, i, j, k, saddle, saddleCnt = 0; scanf("%d%d", &n, &m); for (i = 0;i < n;i++) { for (j = 0;j < m;j++) { scanf("%d", &dat[i][j]); } } for (i = 0;i < n;i++) { for (j = 0;j < m;j++) { saddle = 1; for (k = 0;k < m && saddle == 1;k++) if (dat[i][k] > dat[i][j]) saddle = 0; for (k = 0;k < n && saddle == 1;k++) if (dat[k][j] < dat[i][j]) saddle = 0; if (saddle == 1) { saddleCnt++; printf("%d %d %d\n", dat[i][j], i, j); } } } if (saddleCnt == 0) puts("NO"); return 0; }