原题:“ 若矩形Am*n中的某个元素Aij是第i行的最小值,同时又是第j列的最大值,则称此元素是该矩阵的一个马鞍点。假设以二维数组存储矩阵,试编写程序求出矩阵的所有马鞍点。”
做了一下,并与网上的代码对比了,似乎我的时间复杂度更低。
代码如下:
#if 0 //网上的方法 #include<iostream> using namespace std; void Find(int A[3][3],int m,int n) { int min,i,j,k; bool 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) { cout<<"寻找到的马鞍点为:"<<"A["<<i<<"]"<<"["<<j<<"]"<<" "<<A[i][j]; } } } } } void main() { int a[3][3]={{1,2,3},{9,6,7},{2,6,6}}; // int a[3][3] = {{1, 2, 3}, {5, 6, 7}, {8, 9, 10}}; cout<<"矩阵为:"<<endl; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { cout<<a[i][j]<<" "; if(j==2) cout<<endl; } } Find(a,3,3); cout<<endl; } #else //我的方法 #include <stdio.h> void print(int a[][3], int m, int n) { int i, j; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { printf("%d\t", a[i][j]); } printf("\n"); } } void find( int a[][3], int m, int n) { int i, j, k; int flag, sum_flag; int tmp; sum_flag = 0; for(i = 0; i < m; i++) { flag = 0; tmp = 0; for(j = 0; j < n; j++) { if(a[i][j] < a[i][tmp]) { tmp = j; //找到第i行中最小值 } } for(k = 0; k < m; k++) { if(a[k][tmp] > a[i][tmp]) { flag++; } } if(0 == flag) { printf("find the vertex is a[%d][%d]: %d\n", i, tmp, a[i][tmp]); sum_flag++; } } if(0 == sum_flag) { printf("no vertex in this matrix.\n"); } } int main() { //int a[3][3] = {{1, 2, 3}, {5, 6, 7}, {8, 9, 10}}; int a[3][3]={{1,2,3},{9,6,7},{2,6,6}}; print(a, 3, 3); find(a, 3, 3); return 0; } #endif