C语言,输入一个正整数n(n小于等于6大于等于1)和n阶矩阵a中的元素,如果找到a的鞍点

/*输入一个正整数n(n小于等于6大于等于1)和n阶矩阵a中的元素,如果找到a的鞍点(鞍点的元素值在该行上最大,在该列上最小),
就输出它的下标,否则输出NO(设a最多有一个鞍点)。*/
#include<stdio.h>
#define n 3
int main(void)
{
int i,j,p,q,a[n][n],b[n][n];
printf("输入数值");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);

for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%2d",a[i][j]);
printf("\n");
}
//找出每行最大的值,赋给数组b
p=q=0;
for(i=0;i<n;i++,p++)
for(j=0;j<n;j++)
if(a[i][j]>a[p][q])
{
a[i][j]=b[p][q];
if(q<n-1)
q=j+1;
}
//将数组b中的值,与数组a的值所在列相比,,,,但是不知道怎么写。。。
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(b[i][j]<a[j][i])
{
printf("鞍点为a[%d][%d]=%d\n",i,j,a[i][j]);
}
else
printf("NO");
}
return 0;

}

if(a[i][j]>a[p][q])
{
a[i][j]=b[p][q]; 这里怎么能改变a中的值?!!
if(q<n-1)
q=j+1;
}追问

我是想把a中每行最大的值赋给b中相应的位置。该怎么改?

追答试一下以下代码
#include<stdio.h>

int main(void)
{
int i,j,n,a[6][6],cnt=0;

printf("input n: " );
scanf("%d", &n );
printf("输入数值:\n");

for(i=0;i<n;i++){
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%2d ",a[i][j]);
printf("\n");
}

for(i=0;i<n;i++)
{
int q=0 ;
//找出每行最大的值
for(j=1;j<n;j++)
{
if(a[i][j]>a[i][q])
q=j ;
}
//a[i][q]为行最大的值
//检查a[i][q]是否是q列最小
for( j=0;j<n;j++ )
{
if ( a[j][q] < a[i][q] )
break;
}
if ( j>= n )
{
printf("鞍点为a[%d][%d]=%d\n",i,q,a[i][q]);
cnt++;
}
}
if ( cnt == 0 )
printf("NO");
return 0;
}

追问

(⊙o⊙)…行倒是行,,但是为什么在最后一个for中,q在不同行会是不同是值?,q=j之后不应该只是一个数值?

追答

不同行的最大值不一定在同一列啊!!q是列值下标!

追问

我指的就是不一定在同一列,而q是一个数值,所以应该不成立嗄😳为什么q能记住不同的数值?

追答

那不是在循环中吗?
在每行的循环中,q是一定的!

追问

q是一定的话,为什么最后一个for循环可以实现?q一定不就代表了最大值在同一列?

追答

好好读一读程序,别不动脑子的问问题,好吗?

追问

对不起😳想了半天还是不知道,,我比较笨能告诉我吗😳

追答for(i=0;i<n;i++)
    {
        int q=0 ; //每行的检查时,先置q为0
        
        for(j=1;j<n;j++)

        {
            if(a[i][j]>a[i][q]) //这里确定一行里最大数的列值q!
                q=j ;
        }
        //a[i][q]为行最大的值
        //检查a[i][q]是否是q列最小
        for( j=0;j<n;j++ )
        {
            if ( a[j][q] < a[i][q] ) //检查当前q列中是否有比a[i][q]小的,有,则结束检查,a[i][q]不是q列的最小值,不是鞍点!
                break;
        }
        if ( j>= n ) //如果a[i][q]是q列最小值,此时,j会是n,输出当前的信息值。
        {
            printf("鞍点为a[%d][%d]=%d\n",i,q,a[i][q]);
            cnt++;
        }
        //到此,q的任务完成了,准备检查下一行,q又会有新的变化了!
    }

追问

😳除了最后一个for循环我都懂,就是对于最后一个for循环中a[i][q]为什么是可以代表不同的列的最大值有疑问,因为q是定值,就算i++也只是在q那一列上不是么

追答

for( j=0;j<n;j++ ) //这里的j此时代表行值
{
if ( a[j][q] < a[i][q] ) 注意这里是检查的q列 , 变化的是j !!!!
先静心读明白代码,自己在纸上写些数据,按程序代码运行情况推演一下!动动手,动动脑。

追问

终于知道了→_→谢谢!

追答

不客气,多动手,多动脑

追问

之前一直没把第一个for的范围看清😳误认为是一个嵌套循环和一个单独for循环

追答

多练习写代码就好了

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答