目录
code 展示:
如果矩阵A中存在这样的一个元素A[i][j]满足下列条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。请编写程序求出矩阵A的马鞍点。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
对于每组测试数据,首先输入2个正整数m、n(1 ≤ m,n ≤ 100),分别表示二维数组的行数和列数。
然后是二维数组的信息,每行数据之间用一个空格分隔,每个数组元素均在int型范围内。简单起见,假设二维数组的元素各不相同,且每组测试数据最多只有一个马鞍点。
输出格式:
对于每组测试数据,若马鞍点存在则输出其值,否则输出“Impossible”。注意,引号不必输出。
输入样例:
3
4 3
6 7 11
2 17 13
4 -2 3
5 9 88
4 4
1 2 3 4
12 13 14 15
23 24 25 26
34 35 36 37
2 3
6 7 11
9 8 3
输出样例:
6
34
Impossible
code演示:
#include <iostream>
using namespace std;
int a[101][101],minn[101];//minn[101]收集第i行中最小值的列数
int main()
{
int t;
cin>>t;
int m,n,mi,k;
while (t--)
{
for(int i=0;i<101;i++){
minn[i]=0;//经过一次循环把数组重新初始化为0
for(int j=0;j<101;j++)a[i][j]=0;
}
cin>>m>>n;
int cnt=0;
for(int i=0;i<m;i++)
{
mi=0;//记录每一行最小值的列数
for(int j=0;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]<=a[i][mi])mi=j;
//勿忘取等号(坑爹,若最大值有多个,则取靠右的)
//有个测试点,但是题目没说明,无语啊!
}
minn[i]=mi;
//把每一行最小值的列数记入到minn数组里面
}
int i,j;
for( j=0;j<n;j++)
{
for( i=0;i<m;i++)
{
if(a[i][minn[j]]>a[j][minn[j]])break;
//在每行最小值所在列里验证该数是否为最大值
}
if(i==m){//如果循环结束未能找到那么这个值就是最大值
k=j;//用一个k把j的值记录下来,防止循环继续导致j++就寄了
cnt=1;//我就是直接输出j错了好多次
}
}
if(cnt==1) cout<<a[k][minn[k]];
else cout<<"Impossible";
if(t!=0)cout<<endl;//防止最后一组输出换行
}
return 0;
}
PTA效果展示:
老规矩结尾水字数 ,刷10行
老规矩结尾水字数 ,刷10行
老规矩结尾水字数 ,刷10行
老规矩结尾水字数 ,刷10行
老规矩结尾水字数 ,刷10行
老规矩结尾水字数 ,刷10行
老规矩结尾水字数 ,刷10行