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

时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题