/*程序填空,不要改变与输入输出有关的语句。
输入一个正整数 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"迅滑袜);
}
}