• 矩阵鞍点的寻找


    偶然间,看到一个寻找鞍点的小问题,仔细想想,很多人的程序设计的都不能很好的解决每一行有多个最大值的情况(包括谭浩强的版本,竟然写的那么不严密,误人子弟啊)

    自己敲了一个。

    首先,解释一下鞍点的概念:这个点应该既是行的最大值同时又是列的最小值。

    不说没用的,贴上代码:

    /*
    寻找SaddlePoint:即同时是行的最大值和列的最小值。
    @author:Apart1.424.sci&teque.ncepu;
    2012.6.11
    */

    /*
    主要针对每一行可能最大值相等的有多个这一问题设计的算法。
    algorithm:
    2次遍历:第一次遍历寻找每行的最大值,第二次判断最大值的元素是否为最小值。
    */

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    void main()
    {
    int m,n,i,j,k;
    int *nRowMax,**mat;//mat保存矩阵,nRowMax保存每行的最大值

    printf("请输入矩阵的行数和列数:");
    scanf("%d %d",&m,&n);

    mat=(int **)malloc(m*sizeof(int *));
    for(i=0;i<m;i++)
    mat[i]=(int *)malloc(n*sizeof(int));
    nRowMax=(int *)malloc(m*sizeof(int));
    memset(nRowMax,0,m);//根据需要设置矩阵的最小值

    printf("请输入矩阵:\n");//输入的同时,判定每行的最大值
    for(i=0;i<m;i++)
    {
    for(j=0;j<n;j++)
    {
    scanf("%d",&mat[i][j]);
    if(mat[i][j]>nRowMax[i])
    nRowMax[i]=mat[i][j];
    }
    }

    //第二次遍历 判断最大值的元素是否是列的最小值
    for(i=0;i<m;i++)
    {
    for(j=0;j<n;j++)
    {
    if(mat[i][j]==nRowMax[i])
    {
    for(k=0;k<m;k++)
    {
    if(mat[k][j]<nRowMax[i])
    break;
    }
    if(k==m)
    printf("Saddle Point:%d,(%d,%d)\n",nRowMax[i],i+1,j+1);
    }
    }
    }

    }

  • 相关阅读:
    用sed删除文件中指定行
    传输文件到docker容器
    RAID技术全解图解-RAID0、RAID1、RAID5、RAID100
    Best PDF Document Viewers for Linux Systems
    nvidia docker install
    cuda apt install
    Ubuntu16_18建立返回桌面、显示桌面的快捷图标的特殊方法
    Linux Shell sort排序常用命令
    linux cut用法
    DispatcherServlet的作用
  • 原文地址:https://www.cnblogs.com/tupx/p/2545502.html
Copyright © 2020-2023  润新知