您的位置:首页 > 编程语言 > C语言/C++

【咀嚼C语言】二维数组找鞍点

2011-11-12 20:48 232 查看
【要求】找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。

【咀嚼】我的思路是,某一行上有可能有两个相等的数,且都是最大值,如果只判断第一个数,第二个便不再判断,而第二个数才是其所在的列上最小的,就会把一些鞍点漏掉(在列上也是如此,相同的都要判断)。所以我设定一行上可以有一个以上鞍点,也就是说,如果整个数组的元素都是相同的,那么这个数组里的每一个元素都是鞍点。

据于此,我写下如下代码

#include<stdio.h>
int main()
{
int ctu;
do
{        //begin
int a[18][18],i,j,b=1,c=0,d,m,n;        //b用来标记,c用来计数,d是另外的循环控制
printf("请自定义数组大小,如3*4\n");
scanf("%d*%d",&m,&n);
printf("请输入一个%d×%d的二维数组\n",m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);        //输入数组
for(i=0;i<m;i++)                //第一层循环,控制行
for(j=0;j<n;j++)            //第二层循环,控制列
{
for(d=0;d<n;d++)        //判断是否行上最大
if(a[i][j]<a[i][d]) b=0;
if(b==0) continue;
for(d=0;d<m;d++)        //判断是否列上最小
if(a[i][j]>a[d][j]) b=0;
if(b==0) continue;
c++;
printf("第%d个鞍点:%d,位于第%d行、第%d列\n",c,a[i][j],i+1,j+1);
}
if(c==0)printf("该二维数组没有鞍点");
else printf("该数组有%d个鞍点",c);
printf("\n是否继续?\n输入1继续,否则任意键退出\n");        //end
scanf("%d",&ctu);
}while(ctu==1);
return 0;
}


但是在测试时出现了如下错误,即只能判断出所有的元素都相等的情况,一般情况则无法判断。



所有的元素都相同,可以正确地把所有的数字都找出来,但是输入一个普通的数字,则无法正常找出,下图



经过分析,原来是在第16与17行之间少了一个让判断标志b重置为1的语句,导致如果第一个元素不成立,则b变成了0,之后的每一个元素都会直接跳出。

修改如下:

#include<stdio.h>
int main()
{
int ctu;
do
{        //begin
int a[18][18],i,j,b,c=0,d,m,n;        //b用来标记,c用来计数,d是另外的循环控制
printf("请自定义数组大小,如3*4\n");
scanf("%d*%d",&m,&n);
printf("请输入一个%d×%d的二维数组\n",m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);        //输入数组
for(i=0;i<m;i++)                //第一层循环,控制行
for(j=0;j<n;j++)            //第二层循环,控制列
{
b=1;                    //先前的错误就在于此,要重置b为1
for(d=0;d<n;d++)        //判断是否行上最大
if(a[i][j]<a[i][d]) b=0;
if(b==0) continue;
for(d=0;d<m;d++)        //判断是否列上最小
if(a[i][j]>a[d][j]) b=0;
if(b==0) continue;
c++;
printf("第%d个鞍点:%d,位于第%d行、第%d列\n",c,a[i][j],i+1,j+1);
}
if(c==0)printf("该二维数组没有鞍点");
else printf("该数组有%d个鞍点",c);
printf("\n是否继续?\n输入1继续,否则任意键退出\n");        //end
scanf("%d",&ctu);
}while(ctu==1);
return 0;
}


测试成功





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: