矩阵鞍点的算法,用c++实现。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵鞍点的算法,用c++实现。相关的知识,希望对你有一定的参考价值。

若在m×n的矩阵中有一个元素a[i,j]满足下述条件:a[i,j]既是第i行元素中的最小值,又是第j列元素中的最大值(称为鞍点),试写一个求矩阵鞍点的算法,并分析你所写的算法所需时间。

#include<iostream>
#include<stdlib.h>
using namespace std;
const int M=4,N=5;

int main(void)
int i,j;
int i_array_s[M][N];
void find(int i_array_x[M][N]);
cout<<"请输入一个"<<M<<"乘"<<N<<"数组:"<<endl;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
cin>>i_array_s[i][j];


find(i_array_s);
system("pause");
return 0;

void find(int i_array_x[M][N])
int i,j,k,n=0;
int temp,row,column;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(i_array_x[i][0]<i_array_x[i][j])//找到行最大的
temp=i_array_x[i][j];
row=i;
column=j;


for(k=0;k<M;k++)
if(i_array_x[k][column]<i_array_x[row][column])//判断是不是列最小的
break;

else if(k==M-1)
cout<<"马鞍点有:"<<endl;
cout<<"第"<<row+1<<"行"<<column+1<<"列:"<<i_array_x[row][column]<<endl;
n++;



if(!n)
cout<<"没有鞍点"<<endl;
else
cout<<"总共有"<<n<<"个鞍点"<<endl;
参考技术A 才15分啊,呵呵,看我的:
#include <iostream>
using namespace std;

void main()

const int row=5,col=5;
int array[row][col];
int i,j,min_row=0,min_col=0,max,min,m,n;
int r;

for(i=0;i<5;i++)

for(j=0;j<5;j++)
cin>>array[i][j];



for(i=0;i<5;i++)

for(j=0;j<5;j++)
cout<<array[i][j]<<" ";
cout<<endl;



for(m=0;m<5;m++) //一行一行进行试探

min=array[m][0];
min_row=m;
min_col=0;
for(n=0;n<5;n++) //寻找行上的最小值

if(min>array[m][n])

min=array[m][n];
min_row=m;
min_col=n;



max=array[m][min_col]; //寻找列上最大值,这个最大值最初指定为array[m][min_col],就是找出的行上的最小值

for(r=0;r<5;r++)

if(max<array[r][min_col])
max=array[r][min_col];



if(min==max)
cout<<"马鞍点是"<<max<<endl;
else
cout<<"no"<<endl;



c语言查找二维数组的鞍点 新生求助大佬

对于给定的整数矩阵A[5,5],设计算法查找出所有的鞍点。
提示:鞍点的特点:列上最小,行上最大。

输入格式:
输入5行5列整数,同行数据间以空格为间隔。

输出格式:
在一行中以以下格式输出矩阵中的所有鞍点,每个鞍点的显示格式为:
[<鞍点的行坐标>,<鞍点的列坐标>,<鞍点的值>]

输入样例:
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 8
15 10 11 20 25
结尾无空行
输出样例:
[3,0,8][3,4,8]
结尾无空行

C语言查找二维数组的鞍点详细代码如图:

具体思路:

一、先把每行的最大值求出来×到数组;

二、依次遍历每行,如果其值等于最大值,再判断在列中是否最小即可。

三、输出结果。

参考技术A

#include <stdio.h>

int main()

int i,j,min,max,m=5,n=5,found=0;

  int a[5][5],h[5],l[5];

  for(i=0; i<m; i++)

    for(j=0; j<n; j++)

      scanf("%d",&a[i][j]);

  for(i=0; i<m; i++)

  h[i]=a[i][0];

    for(j=1; j<n; j++)

      if(a[i][j]>h[i])

        h[i]=a[i][j];

  //找出每行最大值

  for(j=0; j<n; j++)

  l[j]=a[0][j];

    for(i=1; i<m; i++)

      if(a[i][j]<l[j])

        l[j]=a[i][j];

  //找出每列最小值

  for(i=0; i<m; i++)

  for(j=0; j<n; j++)

      if(l[j]==h[i])

        printf("[%d,%d,%d]",i,j,a[i][j]);

         found=1;

       

  //进行比较,若行最小与列最大相等,则输出

  if(!found)printf("没有鞍点");

本回答被提问者采纳
参考技术B 开两个数组,一个数组存每一行的最大值,一个数组存每一列的最小值。先扫两遍矩阵把这两个数组计算出来,然后再扫一遍检查矩阵中每个元素是否同时等于其所处列的最小值与所处行的最大值,如果是就是鞍点,这样就行了吧。

以上是关于矩阵鞍点的算法,用c++实现。的主要内容,如果未能解决你的问题,请参考以下文章

用C或C++实现求最短路径的Dijkstra算法

c语言查找二维数组的鞍点 新生求助大佬

C语言编程题,找鞍点

c++利用邻接矩阵存储方法实现图的存储与输出。

c++实现矩阵运算的加减法乘法以及测试用例

c++实现矩阵运算的加减法乘法以及测试用例