C言語のメモ:ハメポイントの問題

オリジナルリンク: http://c.biancheng.net/c/

問題の説明:
M×n個(1 <n及びm <= 10)行列、各行列の行だけ最大値が存在し、各列の最小値は、サドルポイントを見つけるためにマトリックスを必要とします。サドル点は何ですか?すなわち、行列要素、すなわち列が最小となる行の最大値です必要な出力サドル点座標と、その値がある場合は出力なしサドル点で「NO鞍点」場合

ソリューション:

  • 列番号の下の最初の行の最大要素[行] [COL]、COL行を見つけるために、最初の外側ループ、開始行から行番号、行線を作る場合に最大要素
  • 次いで[COL] [行]よりも小さい要素は、それぞれCOL列を有しているかどうかを確認するために、続いて
  • その後見つからないか、さらに見つけに従って決定されていません

コード:

#include <stdio.h>
const int N=11;
int AnDian(int a[N][N],int n,int m,int *r,int *c);//在n*m数组中找鞍点,如果找到用*r,*c存放鞍点行号、列号,返回1;否则返回0 
int main(void)
{
 int a[N][N],r,c;//r,c分别存放鞍点的行号和列号 
 int n,m;
 printf("输入n m:\n");
 scanf("%d %d",&n,&m);
 printf("接着输入n*m个矩阵元素:\n");
 for(int i=1;i<=n;i++)
 {
  for(int j=1;j<=m;j++)
  {
   scanf("%d",&a[i][j]);
  }
 }
 int res=AnDian(a,n,m,&r,&c);
 if(res)
 {
  printf("鞍点元素下标,以及元素值为:");
  printf("(%d,%d) %d\n",r,c,a[r][c]);
 }
 else
 {
  printf("not found!\n");
 }
 return 0;
}
int AnDian(int a[N][N],int n,int m,int *r,int *c)
{
 int flag=0;//0表示没找到,1表示找到,初始化未找到 
 for(int row=1;row<=n;row++)//该层循环用于控制指向矩阵的行数 
 {
  int col=1;//假设row行的第1列元素是row行的最大元素 
  int j;//①用于控制第一个内层for循环次数 以及 ②判断是否完全循环完第二个内层for循环次数
  for(j=2;j<=m;j++)//用于找出row行的最大元素的col下标,col随着元素的增大不断更新 
  {
   if(a[row][j]>a[row][col])
   {
    col=j;
   }
  }
  for(j=1;j<=n;j++)//将该col下标元素与其上下行元素比较,看是否是第col列最小元素 
  {
   if(a[j][col]<a[row][col])
   {
    break;//若没有提前退出当前循环(此时j==n+1),则a[row][col]是第col最小元素 
   }
  }
  if(j==n+1)
  {
   flag=1;
   *r=row;
   *c=col; 
   break;
  }
 } 
 return flag; 
}

出力:
ここに画像を挿入説明
私はプログラムをやってで見つかったが、唯一見つかった最初の、そしてそのインデックスが、いくつか慎重に考え行列のサドル点に戻る(マトリックスとより多くのリピート要素を持っている)ことができ、我々は唯一のサドルポイントを見つけたりしますでもどちらの場合は、神が大きいが、それを説明する見ることができますか?またはマトリックスは、複数のサドルポイントを持つことができますが、私は期待していませんでした。頭痛!

おすすめ

転載: blog.csdn.net/weixin_42124234/article/details/102561176