【咀嚼C语言】二维数组找鞍点
2011-11-12 20:48
232 查看
【要求】找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。
【咀嚼】我的思路是,某一行上有可能有两个相等的数,且都是最大值,如果只判断第一个数,第二个便不再判断,而第二个数才是其所在的列上最小的,就会把一些鞍点漏掉(在列上也是如此,相同的都要判断)。所以我设定一行上可以有一个以上鞍点,也就是说,如果整个数组的元素都是相同的,那么这个数组里的每一个元素都是鞍点。
据于此,我写下如下代码
但是在测试时出现了如下错误,即只能判断出所有的元素都相等的情况,一般情况则无法判断。
![](https://lh5.googleusercontent.com/-ojBbF9xQSEo/Tr5kto_cMTI/AAAAAAAAAXs/hxWiSAYYN-0/s647/01.jpg)
所有的元素都相同,可以正确地把所有的数字都找出来,但是输入一个普通的数字,则无法正常找出,下图
![](https://lh4.googleusercontent.com/-Kndw-oSsTKU/Tr5ktlPjYrI/AAAAAAAAAXo/hDo6EIdt5zM/s597/02.jpg)
经过分析,原来是在第16与17行之间少了一个让判断标志b重置为1的语句,导致如果第一个元素不成立,则b变成了0,之后的每一个元素都会直接跳出。
修改如下:
测试成功
![](https://lh5.googleusercontent.com/-BjILpMK2s_4/Tr5om1N3E_I/AAAAAAAAAYU/aWxW2_mVGgE/s364/%2525E6%25259C%2525AA%2525E5%252591%2525BD%2525E5%252590%25258D.jpg)
![](http://service.t.sina.com.cn/widget/qmd/2202038861/98069e91/1.png)
【咀嚼】我的思路是,某一行上有可能有两个相等的数,且都是最大值,如果只判断第一个数,第二个便不再判断,而第二个数才是其所在的列上最小的,就会把一些鞍点漏掉(在列上也是如此,相同的都要判断)。所以我设定一行上可以有一个以上鞍点,也就是说,如果整个数组的元素都是相同的,那么这个数组里的每一个元素都是鞍点。
据于此,我写下如下代码
#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; }
但是在测试时出现了如下错误,即只能判断出所有的元素都相等的情况,一般情况则无法判断。
![](https://lh5.googleusercontent.com/-ojBbF9xQSEo/Tr5kto_cMTI/AAAAAAAAAXs/hxWiSAYYN-0/s647/01.jpg)
所有的元素都相同,可以正确地把所有的数字都找出来,但是输入一个普通的数字,则无法正常找出,下图
![](https://lh4.googleusercontent.com/-Kndw-oSsTKU/Tr5ktlPjYrI/AAAAAAAAAXo/hDo6EIdt5zM/s597/02.jpg)
经过分析,原来是在第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; }
测试成功
![](https://lh5.googleusercontent.com/-BjILpMK2s_4/Tr5om1N3E_I/AAAAAAAAAYU/aWxW2_mVGgE/s364/%2525E6%25259C%2525AA%2525E5%252591%2525BD%2525E5%252590%25258D.jpg)
![](http://service.t.sina.com.cn/widget/qmd/2202038861/98069e91/1.png)
相关文章推荐
- 二维数组的“鞍点”(C语言)
- 【C语言】找出一个二维数组的“鞍点”【原创技术】
- C语言,二维数组 找鞍点
- 【c语言】:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
- C语言博客作业--一二维数组
- C语言博客作业--一二维数组
- C语言第七次博客作业--一二维数组
- C语言博客作业--一二维数组
- C语言的指针与二维数组
- 求二维数组中的鞍点【数组】
- C语言中如何将二维数组作为函数的参数传递
- 黑马程序员-------C语言回顾-二维数组
- 7-6 找鞍点(二维数组的应用)
- C语言二维数组作为函数参数
- [总结]C语言二维数组作为函数的参数
- 程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)
- C语言动态申请二维数组
- c语言指针篇——数组指针和指向二维数组的指针变量(*p)[N]
- C语言 如何动态创建二维数组
- C语言 寻找输入二位数组中的鞍点