首页 > 试题广场 >

找鞍点。输入1个正整数n ((1≤n≤6))和n阶方阵a中的

[问答题]

找鞍点。输入1个正整数n ((1≤n≤6))和n阶方阵a中的元素,假设方阵a最多有1个鞍点,如果找到a的鞍点,就输出其下标,否则,输出“NO”。鞍点的元素值在该行上最大,在该列上最小。试编写相应程序。

推荐
#include <stdio.h>
int main(void)
{
   int flag,i,j,k,row,col,n,a[6][6];
   printf("Input n: ");
   scanf("%d",&n);
   printf("Input array:\n ");
   for(i=0; i<n; i++)
       for(j=0; j<n; j++)
           scanf("%d",&a[i][j]);
   for(i=0;i<n;i++){
       flag=1; col=0;
       for(j=0;j<n;j++)
           if (a[i][col]<a[i][j])  col=j;
       for (k=0; k<n; k++)
           if(a[i][col]>a[k][col] ){
               flag=0; break;
            }
      if(flag){
         row=i; break;
         }
   }
   if(flag)
      printf("a[%d][%d]=%d\n", row, col,a[row][col]);
   else
      printf("NO\n");
   return 0;
}

发表于 2018-05-06 21:35:46 回复(0)
#include<stdio.h>
/**
利用一个标记矩阵mark[][],初始化为全0;
先进行行优先遍历,找到每行最大点,依次标记mark[][]为1;
再进行一次列优先,找到每列最小点,若当前点标记mark[][]为1,则为“鞍点”,输出
*/
int main(){
    int n;
    int a[6][6],mark[6][6];
    int i,j;    // i 行 j 列
    int temp;

    //初始化
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            mark[i][j] = 0;

    //输入
    printf("input n: ");
    scanf("%d",&n);
    printf("input matrix:\n");
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }

    //找最大
    for(i=0;i<n;i++){
        temp = a[i][0];
        for(j=1;j<n;j++){       //找到最大值是多少
            if(temp<a[i][j])
                temp = a[i][j];
        }
        for(j=0;j<n;j++){       //找到最大值所在的位置 标记
            if(temp == a[i][j])
                mark[i][j] = 1;
        }
    }

    //找最小
    for(j=0;j<n;j++){
        temp = a[0][j];
        for(i=1;i<n;i++){
            if(temp>a[i][j])
                temp = a[i][j];
        }
        for(i=0;i<n;i++)
            if((temp == a[i][j])&&mark[i][j]==1){
                printf("value = %d\n",a[i][j]);
                printf("(%d,%d)\n",i,j);

            }
    }

    return 0;
}

发表于 2022-02-09 10:56:21 回复(0)

关键在于:最大最小值的寻找,多个for的嵌套使用,以及flag的灵活使用。思路是先针对某一行,进行查找最大值;最大值的下标确定后,针对这一列,判断这个最大值,在当前列下是否是最小值。关于flag,先首先假设存在答案,令flag=1。如果找到一个答案,则不改变flag,break出for循环。如果所有答案都找不到,则flag=0。

#include<stdio.h>
int main()
{
    int n,flag,y;
    int a[7][7];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            scanf("%d",&a[i][j]);

    for(int i=0;i<n;i++)
    {
        y=0;
        flag=1;
        for(int j=0;j<n;j++)//找一行中的最大值
        {
            if(a[i][j]>a[i][y])
                y=j;
        }
        for(int j=0;j<n;j++)
        {
            if(a[j][y]<a[i][y])
            {
                flag=0;
                break;
            }
        }
        if(flag){
            printf("靶点:(%d,%d)(第%d行,第%d列)\n",i,y,i+1,y+1);
            break;
        }
    }
    if(!flag)
        printf("no\n");
}

发表于 2020-04-04 17:25:40 回复(0)