안장 문제

10470 단어 문제.
원제: "만약 직사각형 Am*n의 원소 Aij가 i행의 최소값이자 j열의 최대값이라면 이 원소가 이 행렬의 안장점이라고 한다. 2차원 그룹으로 행렬을 저장한다고 가정하고 프로그램이 행렬의 모든 안장점을 구한다."
한 번 해 보았는데, 인터넷의 코드와 비교해 보니, 나의 시간 복잡도가 더욱 낮은 것 같다.
코드는 다음과 같습니다.
#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("
"); } } 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
", i, tmp, a[i][tmp]); sum_flag++; } } if(0 == sum_flag) { printf("no vertex in this matrix.
"); } } 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

좋은 웹페이지 즐겨찾기