一、问题
编写程序,输入n和n*n的整数矩阵元素,求其鞍点。n不超过10。
如果矩阵A中存在这样的一个元素A[i,j]满足条件:A[i,j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。
输入:矩阵阶数n, 然后按行输入n*n个矩阵元素。
输出:若干行,每行是矩阵的一个鞍点的行号、列号和数值,用一个空格隔开。若矩阵没有鞍点,输出"None"。
【输入输出样例1】
输入:
3
1 7 3
5 4 6
17 18 9
输出:
3 3 9
【输入输出样例2】
输入:
3
5 19 20
6 20 9
19 18 5
输出:
None
二、代码
/*#include <stdio.h>
int main(){
/*int c,a,b;
scanf("%d",&c);
//int arr[c][c];//既然变量不能放在数组里面,那怎么定义呢??
int arr[10][10];
for(a=0;a<c;a++){
for(b=0;b<c;b++){
scanf("%d",&arr[a][b]);
}
}
for(a=0;a<c;a++){//如何控制比较??
if(arr[a][0])
}
//重做吧,,,痛!!
int i,j,k,n;
scanf("%d",&n);
int arr[n][n];//注意数组定义是开集,是长度!//变量不是不能吗???
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&arr[i][j]);
}
}
int flag=1;//flag=1,ture
int x=0,y;
for(i=0;i<n;i++){
for(j=1;j<n;j++){
if(arr[i][x]<arr[i][j]){
x=j;
}
}
y=i;
for(k=0;k<n;k++){
if(arr[y][x]>arr[k][x]){
break;
}
}
}
if(flag==0) printf("None");
if(flag==1) printf("%d %d %d",i+1,x+1,arr[i][x]);
return 0;
}
/*一个矩阵最多有一个马鞍点 qisiwol
*/
#include<stdio.h>
int main()
{
int n,i,j,k;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
int x=0,y,flag=0;
if(n==1)
printf("0 0");
else{
for(j=0;j<n;j++){
for(i=0;i<n;i++){ //找出列中min的数,并将其位置定位a[x][j]
if(a[i][j]>=a[x][j]){
x=i; //将列中小的值的位置更新
}
}
y=j;
for(k=0;k<n;k++){ //找出行中max的数,并将其位置定位a[x][y]
if(a[x][k]<a[x][y]){
y=k; //发现有比a[x][y]值更大的数,则说明该点不是鞍点
break; //并且该行最大值更新到第一个比a[x][y]大的数
}
}
if(y==j){ //行最大值的y坐标与列最小值的相同,该点为鞍点
flag=1;
break;
}
}
if(flag==1)printf("%d %d %d",x+1,y+1,a[x][y]);
else printf("None");
}
return 0;
}
三、tips
1.记录行列位置
2.注意读题
3.break函数的使用
4.这个题确实不太熟