导航:首页 > 源码编译 > 马鞍点算法

马鞍点算法

发布时间:2023-02-16 07:48:05

Ⅰ 如果A[i]j]是第i行的最小值,第j列的最大值,则称之为马鞍点。编写算法找这样的马鞍点。

v

Ⅱ C/C++中寻找A[M][N]马鞍点的疑问假设A[2][2]={{1,1},{2,2}},那么是不是A[0][0],A[0][1]都是马鞍点

呃,鞍点指的是最大值与最小值。如果每行都相同,何来鞍点?
鞍点的几何意义就是行列的极值,如果将值转化成高度,就是马鞍的形状。
{1,1},{2,2},转化成高度,完全没有正确的形状,因此不存在鞍点。

Ⅲ 帮忙用数据结构做下此程序,假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。谢谢。。。

public class P1{
private int[][] a=null;
private int rownum=0,colnum=0;
//存储每行中最小的那个数的行和列,如"1,2"---第一行,第二列
private int[] rows=null;
//存储每列中最大的那个数的行和列,如"1,2"---第一行,第二列
private int[] cols=null;
private int num=0;
P1(int[][] a,int row,int col){
this.a = a;
this.rownum=row;
this.colnum=col;
rows = new int[row];
cols = new int[col];
}

public void setMinRow(){
int min;
int minIndex;
for(int r=0;r<rownum;r++){
min = a[r][0];
minIndex=0;
for(int c=0;c<colnum;c++){
if(a[r][c]<min){
min = a[r][c];
minIndex=c;
}
}
rows[r]=minIndex;

}
}

public void setMaxCol(){
int max;
int maxIndex;
for(int c=0;c<colnum;c++){
max = a[0][c];
maxIndex=0;
for(int r=0;r<rownum;r++){
if(a[r][c]>max){
max = a[r][c];
maxIndex=r;
}
}
cols[c]=maxIndex;
}
}

public void getSaddleNUm(){
setMinRow();
setMaxCol();
for(int r=0;r<rownum;r++){
if(r==cols[rows[r]]){
num++;
System.out.println("第"+num+"个马鞍点是行"+r+"列"+rows[r]+":"+a[r][rows[r]]);
}
}
}

public void print(){
for(int r=0;r<rownum;r++){
for(int c=0;c<colnum;c++){
System.out.print(a[r][c]+" ");
}
System.out.println("");
System.out.println("-----------");
}
}

public static void main(String[] args){
//存放矩阵的数值
int[][] a1 = {{1,5,9,10,2},{7,5,6,3,2},{11,7,9,0,12},{6,9,13,10,21},{11,4,13,40,32},{21,16,91,100,42}};
//第一个参数为存放矩阵的数组,第二个参数为矩阵行数,第三个为矩阵列数
P1 p = new P1(a1,6,5);
p.getSaddleNUm();
p.print();
System.out.println("矩阵拥有的马鞍点数为:"+p.num);
}
}

Ⅳ 数据结构

int visited[MAXSIZE]; //指示顶点是否在当前路径上
int exist_path_DFS(ALGraph G,int i,int j)//深度优先判断有向图G中顶点i到顶点j是否有路径,是则返回1,否则返回0
{
if(i==j) return 1; //i就是j
else
{
visited[i]=1;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
k=p->adjvex;
if(!visited[k]&&exist_path(k,j)) return 1;//i下游的顶点到j有路径
}//for
}//else
}//exist_path_DFS

void find(int A[][],int m,int n)//求矩阵A中的马鞍点
{
int i,j,min,flag;
for(i=0;i<m;i++)
{
for(min=A[i][0],j=0;j<n;j++)
if(A[i][j]<min) min=A[i][j]; //求一行中的最小值
for(j=0;j<n;j++)
if(A[i][j]==min) //判断最小值是否是马鞍点
{
for(flag=1,k=0;k<m;k++)
if(min<A[k][j]) flag=0;
if(flag)
printf("%d",A[i][j]);
}
}
}

void Merge(LinkList &A,LinkList &B,LinkList &C) //假设是递增序列
{
LinkList p,q,r;
p=A->next;
q=B->next;
r=C=A;
while(p&&q)
{
if(p->data<q->data)
{
r->next=p;
r=r->next;
p=p->next;
}
else
{
r->next=q;
r=r->next;
q=q->next;
}
}
r->next=(p!=NULL?p:q);
free(B);
}

Ⅳ 输出马鞍点的函数

//两个关键错误改出来了,但没看懂你的(Array2D &a,)
void SaddlePoint(Array2D &a, int m, int n)
/* 求出矩阵a中所有马鞍点 */
/* 注意:行号和列号分别为0..m-1和0..n-1 */
{ int min;
int i,j,l;
for (i=0;i<m;i++)
{
min=0;//要在这符值为0;不然就没有判断min前的数是否大于此数,得出错误答案。
for (j=1;j<n;j++)
if (a[i][min]>a[i][j]) min=j;
int tip=1;
for (l=0;l<m;l++)//这是从列的第一个元素判断。
if (a[i][min]<a[l][min])
{tip=0; l=m;}
if (tip) outSP(i,min);
}

}

Ⅵ 急急!!C语言数据结构题,求马鞍点

#include<stdio.h>

int main()
{
int n, m, i, j, k, l, minn, maxx, flag ;
int a[256][256];
while(1)
{
printf("请输入矩阵的行列数:\n");
scanf("%d %d",&n,&m);
printf("请输入与行列数相符的矩阵:\n");
for( i =0 ;i < n ;i++)
for( j =0 ;j < m; j++)
scanf("%d",&a[i][j]);
flag = 0;
printf("马鞍点输出(输出该点所在的行数与列数):\n");
for( i = 0; i < n ;i++)
{
for( j = 0; j < m; j++)
{
minn = a[i][j];
for( k = 0 ;k < m; k++)
{
if( minn > a[i][k])
break;
}
if( k == m)
{
maxx = a[i][j];
for( l = 0; l < n; l++)
{
if( maxx < a[l][j])
break;
}
if( l == n)
{
printf("%d %d %d\n",i , j ,a[i][j]);
flag = 1;
}
}
}
}
if( flag == 0)
printf("此矩阵没有马鞍点");
printf("\n");
}
return 0;
}

Ⅶ 用C# 编程,给定一个m×n的数值矩阵A,如果矩阵A中存在这样的一个元素A[i][j]满足条件:

先创建两个一维数组记为M、N,再逐行扫描这个矩阵,把每一行里最小的元素下标记下来放入数组M、N中分别表示行列,(例如:第一行第三个元素6为第一行最小的,记下M[0]=1,N[0]=6),然后对数组A[i][j]中所有记下下标的数据在其所在列中进行比较(例如:第一行第三个元素6为第一行最小的,就在第六列中进行比较),看这个数据是否为该列最大的元素,是则保留,否则舍去。思路就是这样,代码很简单,自己搞定吧。

Ⅷ C语言求助

可以修改M和N来修改矩阵的维数

#include<stdio.h>
#define M 3
#define N 3
main()
{
int i,j,obj,p,q,flag=1,flag2=0;
float a[M][N];
printf("请输入矩阵元素!\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%f",&a[i][j]);
printf("矩阵元素如下:\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%f ",a[i][j]);
printf("\n");
}
for(i=0;i<M;i++)
{
obj=a[i][0];
p=0;
for(j=1;j<N;j++)
if(obj<a[i][j])
{
obj=a[i][j];
p=j;
}
for(j=0;j<N;j++)
if(obj>a[j][p])
{
flag=0;
break;
}
flag2+=flag;
if(flag==1)
printf("有鞍点:a[%d][%d]=%f\n",i,p,a[i][p]);
}
if(flag2==0)
printf("没有鞍点!\n");

}

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

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

阅读全文

与马鞍点算法相关的资料

热点内容
薯仔视频APP怎么看不了 浏览:550
社交软件app该怎么聊 浏览:23
pc的启动文件夹 浏览:671
文件夹压缩过程中点击取消压缩 浏览:215
顺丰app专享优惠券怎么用 浏览:667
酷狗音乐分享文件夹 浏览:826
服务器mgmt旁边的接口是什么 浏览:844
单片机发光二极管原理图 浏览:50
在北京当程序员6年 浏览:128
编译器gcc如何用 浏览:412
androidbringup 浏览:978
算法设计与分析英文版 浏览:911
java程序员加班吗 浏览:142
编译检查的是什么错误 浏览:405
加密兔f码生成器免费 浏览:292
思科路由器命令明文加密 浏览:171
方舟生存进化服务器如何改名字 浏览:892
央行数字货币app怎么注册 浏览:431
51单片机显示时间 浏览:770
我的世界网易版怎么压缩地图 浏览:682