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

【要求】找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。

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

据于此,我写下如下代码

 1 #include<stdio.h>
2 int main()
3 {
4 int ctu;
5 do
6 { //begin
7 int a[18][18],i,j,b=1,c=0,d,m,n; //b用来标记,c用来计数,d是另外的循环控制
8 printf("请自定义数组大小,如3*4\n");
9 scanf("%d*%d",&m,&n);
10 printf("请输入一个%d×%d的二维数组\n",m,n);
11 for(i=0;i<m;i++)
12 for(j=0;j<n;j++)
13 scanf("%d",&a[i][j]); //输入数组
14 for(i=0;i<m;i++) //第一层循环,控制行
15 for(j=0;j<n;j++) //第二层循环,控制列
16 {
17 for(d=0;d<n;d++) //判断是否行上最大
18 if(a[i][j]<a[i][d]) b=0;
19 if(b==0) continue;
20 for(d=0;d<m;d++) //判断是否列上最小
21 if(a[i][j]>a[d][j]) b=0;
22 if(b==0) continue;
23 c++;
24 printf("第%d个鞍点:%d,位于第%d行、第%d列\n",c,a[i][j],i+1,j+1);
25 }
26 if(c==0)printf("该二维数组没有鞍点");
27 else printf("该数组有%d个鞍点",c);
28 printf("\n是否继续?\n输入1继续,否则任意键退出\n"); //end
29 scanf("%d",&ctu);
30 }while(ctu==1);
31 return 0;
32 }

 

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

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

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

修改如下:

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

 

测试成功

 

 新浪微博,欢迎关注,欢迎各种交流

posted @ 2011-11-12 20:48  风自云  阅读(12189)  评论(0编辑  收藏  举报