若矩阵Am*n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。

  • Post author:
  • Post category:其他


  1. 题目要求:若矩阵Am*n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。

  2. 关键代码:

    void AnDian (int A[][],int m,int n)
    {
        int i,j,k;
        int flag1,flag2;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                flag1=1;
                flag2=1;//假设所有节点均为鞍点
                for(k=0;k<n;k++)
                {   
                    if(A[i][j]>A[i][k])//判断是否为当前行最小 
                        flag1=0;//本行中存在比其小的值,故不是鞍点
                }
                for(k=0;k<m;k++)
                {
                    if(A[i][j]<A[k][j])//判断是否为当前列最大 
                        flag2=0;//本列中存在比其大的值,故不是鞍点
                if(flag1 && flag2)//当前行最小,当前列最大 
                    printf("行号:%d 列号:%d = %d\n",i,j,A[i][j]);
            }
        }
    }
    
  3. 完整程序

    #include <stdio.h> 
    #define MAXSIZE 10
    void AnDian (int A[MAXSIZE][MAXSIZE],int m,int n)
    {
    	int i,j,k;
    	int flag1,flag2;
    	for(i=0;i<m;i++)
    	{
    		for(j=0;j<n;j++)
    		{
    			flag1=1;
    			flag2=1;
    			for(k=0;k<n;k++)
    			{	
    				if(A[i][j]>A[i][k])//判断是否为当前行最小 
    					flag1=0;
    			}
    			for(k=0;k<m;k++)
    			{
    				if(A[i][j]<A[k][j])//判断是否为当前列最大 
    					flag2=0;
    			}
    			if(flag1 && flag2)//当前行最小,当前列最大 
    				printf("行号:%d 列号:%d = %d\n",i,j,A[i][j]);
    		}
    	}
    }
    int main()
    {
    	int A[MAXSIZE][MAXSIZE];//6 4 5 1 2 3 3 2 5
    	int m,n;
    	printf("请输入数组的行数和列数:");
    	scanf("%d%d",&m,&n);
    	printf("请输入数组的元素:");
    	for(int i=0;i<m;i++)
    		for(int j=0;j<n;j++)
    			scanf("%d",&A[i][j]);
    	AnDian(A,m,n);
    } 
    



版权声明:本文为WHISTLE_ZXL原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。