1190 - C语言7.14
时间限制 : 1 秒
内存限制 : 32 MB
找出一个二维数组中的所有鞍点,即该位置上的元素在该行中最大但是在该列中最小。需要注意有可能鞍点不存在,此时需要输出“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; }
Java解答
import java.util.Scanner; public class Main { private static Scanner s = new Scanner(System.in) ; public static void main(String[] args) { int n = s.nextInt() ; int m = s.nextInt() ; int a[][] = new int[n][m] ; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { a[i][j] = s.nextInt() ; } } int max = 0 ; int x = 0 ; int y = 0 ; int sum = 0 ; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { if(a[i][j]>max){ max = a[i][j] ; x = i ; y = j ; } } for (int j = 0; j < a.length; j++) { if(a[j][y]>max){ sum++ ; } } if(sum>0){ System.out.println(a[x][y]+" "+x+" "+y); } x= 0; y =0 ; sum = 0 ; } } }