導航:首頁 > 源碼編譯 > 馬鞍點演算法

馬鞍點演算法

發布時間: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怎麼開通快捷支付 瀏覽:908
pythonredisdict 瀏覽:382
如何攻擊別人網賭伺服器 瀏覽:878
隱私與應用加密的圖案密碼 瀏覽:34
陳情令王一博解壓 瀏覽:35
c編譯器使用說明 瀏覽:703
鄭州前端程序員私活有風險嗎 瀏覽:10
小型螺桿機壓縮機 瀏覽:516
成人解壓最好的方法 瀏覽:48
最小製冷壓縮機 瀏覽:488
xampp支持python 瀏覽:367
深圳周立功單片機 瀏覽:61
圓上點與點之間角度演算法 瀏覽:869
怎麼知道微信關聯了哪些app 瀏覽:702
android事件驅動 瀏覽:888
簽約大屏系統源碼 瀏覽:808
安卓系統怎麼轉入平板 瀏覽:429
安卓手機相機怎麼提取文字 瀏覽:219
如何查看伺服器映射的外網地址 瀏覽:985
圖片刺綉演算法 瀏覽:675