C程 找矩阵中的鞍点 高手帮忙找错 谢啦

/*程序填空,不要改变与输入输出有关的语句。
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入 1 个正整数 n(1≤n≤6)和 n 阶方阵 a 中的元素,假设方阵 a 最多有1个鞍点,如果找到 a 的鞍点, 就输出其下标, 否则,输出"NO"。鞍点的元素值在该行上最大, 在该列上最小。
输入输出示例:括号内为说明
输入:
2 (repeat=2)
4 (n=4)
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
2 (n=2)
1 7
4 1
输出:
a[2][1] = 6
NO */

#include "stdio.h"
int main(void)
{
int flag, i, j, k,index, row, col, n;
int a[6][6];
int repeat, ri;

scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++){
scanf("%d", &n);flag=0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
for(i = 0; i < n; i++){
index=0;
for(j = 1; j < n; j++)
if(a[i][index]<a[i][j]) index=j;
for(k=0;k<n;k++){
if(a[i][index]>a[k][index]) {flag=0;break;}
else {row=i;col=index;flag=1;}
}
}

if(flag != 0)
printf("a[%d][%d] = %d\n", row, col,a[row][col]);
else
printf("NO\n");
}
}

下面是我上课时候写的作业也是神纤找鞍点。。你可以看一下。。

#include<stdio.h>

# define N 20

# define M 20

void main ()

{   int i,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj;

     maxj=0;

   printf(" 输入行数n ");

   scanf("%d",&n);

   printf(" 输入游厅仿列数m ");

   scanf("%d",&m);

   for(i=0;i<n;i++)

   {printf("第%d 行 ",i+1);

     for(j=0;j<m;j++)

   scanf("%d",&a[i][j]);

   }

   for(i=0;i<n;i++)

   {  for(j=0;j<m;j++)

        printf("%5d",a[i][j]);

     printf(" ");  

   }

   flag2=0;

   for(i=0;i<n;i++)

   {  max=a[i][0];

      for(j=0;j<m;j++)

         if(a[i][j]>max)

   伏谨{max=a[i][j];

    maxj=j;

   }

  for(k=0,flag1=1;k<n&&flag1;k++)

   if(max>a[k][maxj])

    flag1=0;

        if(flag1)

  {  printf(" 第%d行,第%d列的%d是鞍点 ",i,maxj,max);

     flag2=1;

  }

   }

   if(!flag2)

    printf(" 矩阵中无鞍点  ");

}


你最后判断鞍点时毁弊做候存在的地方有点问题。flag被反复赋值,只能记录最后一轮循环的值。应卜悄该找到鞍点后就输出。给你改了一下,可能不是最优方法,不过运行正确了,你看一下再试试能不能再优化吧纤衡。。
#include "stdio.h"
int main(void)
{
int flag, i, j, k,index, n;
int a[6][6];
int repeat, ri;

scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++){
scanf("%d", &n);flag=0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
for(i = 0; i < n; i++){
index=0;
for(j = 1; j < n; j++)
if(a[i][index]<a[i][j]) index=j;
for(k=0;k<n;k++){
if(a[i][index]>a[k][index]) break;
if(k==3){
flag=1;//标记找到鞍点
printf("a[%d][%d] = %d\n", i, index,a[i][index]);//只要找到就输出
}
}
}

if(flag == 0)
printf("NO\n");//如果没找到就输出NO
}
}
改好了:亩激
#include "stdio.h"
int main(void)
{
int flag, i, j, k,index, row, col, n;
int a[6][6];
int repeat, ri;

scanf("%d", &repeat);
for(ri = 1; ri <= repeat; ri++){
scanf("%d", &n);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
for(i = 0; i < n; i++){
index=0;
flag=1;
for(j = 1; j < n; j++)
if(a[i][index]<a[i][j]) index=j;
for(k=0;k<n;k++){
if(a[i][index]>a[k][index]) {flag=0;break;}
// else {row=i;col=index;flag=1; break;}
}
if (flag)
{
row=i;col=index;
break;
}
}

if(flag != 0)
printf("a[%d][%d] = %d\n", row, col,a[row][col]);
else
printf("让派NO\n"迅滑袜);
}
}