查找矩阵鞍点(时间复杂度还可以)
Posted cstdio1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找矩阵鞍点(时间复杂度还可以)相关的知识,希望对你有一定的参考价值。
鞍点(注意:这里是二维数组中的)的定义:在行中最大,并且在列中最小的数。
很容易理解,如下面2个例子
1 3 5 4 5 7
2 4 6 3 8 5
5 6 7 6 9 4
2个3*3的数组,第一个有一个鞍点,1行3列的5,第二个没有鞍点。
在网上随便看了下关于求鞍点的C程序,发现都不够严谨,遇到稍微特殊一点的情况,可能就找不出鞍点,例如
1 5 5
2 8 7
3 4 9
这个数组明显有一个鞍点1行3列的5,但是用网上比较随意的求鞍点的C程序是找不出这个鞍点的!原因在于,他们的C程序只比较了(1,2)的5是不是在第2列中最小,而(1,3)中的5并没有判断。如果把上例中的(3,2)的4改为6(比5大),那么(1,2)中的5也是一个鞍点,也就是说这个数组有2个鞍点!
看一下下面更特殊的情况:
7 8 9 6 6 6
3 3 3 6 6 6
5 6 7 6 6 6
第一个数组 中第二行的3,第二个数组中所有的6,都满足鞍点定义:在行中最大,并且在列中最小的数! 这些都是鞍点!
#include <iostream>
using namespace std;
int main()
{
const int a = 15,b = 15;
int m, n, i, j, max_num, min_num, flag = 0,x ,y;
int arrary[a][b], hang[a][b] = {-999}, lie[a][b] = {-999};//辅助的2个二维数组
//cout << "Hello world!" << endl;
cout << "请输入二维数组的行数:
" ;
cin >> m;
cout << "请输入二维数组的行数:
";
cin >> n;
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
cin >> arrary[i][j];
}
for( i = 0;i < m;i++)
{
max_num = arrary[i][0];
for(j = 0;j < n;j++)
{
if(max_num == arrary[i][j])
{
max_num = arrary[i][j];
x = i; y = j;
hang[i][j] = arrary[i][j];
}
if(max_num > arrary[i][j])
hang[i][j] = -999;
if(max_num < arrary[i][j])
{
hang[x][y] = -999;//将之前最大的指覆盖掉
max_num = arrary[i][j];
x = i; y = j;
hang[i][j] = arrary[i][j];
}
}
}
for(j = 0;j < n;j++)
{
min_num = arrary[0][j];
for(i = 0;i < m;i++)
{
if(min_num == arrary[i][j] )
{
min_num = arrary[i][j];
x = i; y = j;
lie[i][j] = arrary[i][j];
}
if(min_num < arrary[i][j])
lie[i][j] = -999;
if(min_num > arrary[i][j])
{
lie[x][y] = -999;
min_num = arrary[i][j];
x = i; y = j;
lie[i][j] = arrary[i][j];
}
}
}
/*
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
cout <<lie[i][j] <<" ";
cout <<"
";
}
return 0;*/
//cout << "鞍点坐标和值分别是:
";
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
if(hang[i][j] == lie[i][j] && hang[i][j] != -999)
{
flag++;
cout << "第" << i+1 <<"行" << "第" << j+1 <<"列:" << lie[i][j] << endl;
}
}
if(!flag) cout <<"没有鞍点!
" << endl;
return 0;
}
以上是关于查找矩阵鞍点(时间复杂度还可以)的主要内容,如果未能解决你的问题,请参考以下文章