c语言找鞍点的程序,麻烦帮我看一下我的c语言找鞍点程序!

2011-11-23 回答

额,我是楼上的281754179。。。 还是第一次发现回答修改有上限的,orz。。。 为方便楼主查看,就用另一个号回答吧: 已帮你找出错了,正在帮你优化优化代码,等等哈~~ 代码改错:(用注释标出来的) #include void main() //你的算法只能找出数组中一个鞍点,例如对于全部元素相等的数组也只能输出第一个鞍点,对于这个的改进我放在后面的代码优化那了 { int i,j,h,l,m=0,n=-1,a[50][50]={0}; char p; while( m== 0) { printf("请输入要求鞍点的二维数组的行数和列数(最大为50)!\n行数:"); scanf("%d",&h); printf("列数:"); scanf("%d",&l); for(i=0;imax) { max=a[i][j]; h1=j; } } min=a[0][h1]; h2=0; for(j=0;j #define max_size 100 //最大长度 struct node { //用来存储所有行的最大值或所有列的最小值的所在元素在数组中的位置 int num[max_size * max_size]; int len; //当前num数组存储数据的长度(length) }; int main() { int hang,lie; //行,列 int arrays[max_size][max_size]; int i,j,flag,min_i,max_j; //flag标记数组有无鞍点 struct node max, min; printf("此为为二维数组找鞍点程序!\n"); printf("请输入行和列的大小(用空格分开,且不超过%d):\n",max_size); scanf("%d%d",&hang,&lie); while((hang > max_size) || (lie > max_size) || (hang <= 0) || (lie <= 0)) { //防错处理,增强程序健壮性 printf("行或列的大小不合法,请重新输入:\n"); scanf("%d%d",&hang,&lie); } //while for(i = 0; i < hang; i++) { printf("请输入第%d行元素(用空格分开):\n",i+1); for(j = 0; j < lie; j++) { scanf("%d",&arrays[i][j]); } //for } //for printf("**********************************\n"); printf("您输入的数组为:\n"); for(i = 0; i < hang; i++) { for(j = 0; j < lie; j++) { printf("%-4d",arrays[i][j]); } //for printf("\n"); } //for max.len = 0; for(i = 0; i < hang; i++) { //找出行的最大值 max_j = 0; for(j = 1; j < lie; j++) { if(arrays[i][max_j] < arrays[i][j]) { //找出该行第一个最大元素所在列的下标max_j max_j = j; } //if } //for max.num[max.len++] = i * lie + max_j; for(j = max_j+1; j < lie; j++) { //找出该行其他最大值,并将其位置存储在max数组中 if(arrays[i][j] == arrays[i][max_j]) { max.num[max.len++] = i * lie + j; } //if } //for } //for min.len = 0; for(j = 0; j < lie; j++) { //找出列的最小值 min_i = 0; for(i = 1; i < hang; i++) { if(arrays[min_i][j] > arrays[i][j]) { //找出该列第一个最小元素所在行的下标min_i min_i = i; } //if } //for min.num[min.len++] = min_i * lie + j; for(i = min_i+1; i < hang; i++) { //找出该列其他最小值,并将其位置存储在min数组中 if(arrays[i][j] == arrays[min_i][j]) { min.num[min.len++] = i * lie + j; } //if } //for } //for flag = 0; //先假设该数组无鞍点 for(i = 0; i < max.len; i++) { //比较max和min数组中有无相同的值 for(j = 0; j < min.len; j++) { if(max.num[i] == min.num[j]) { flag = 1; //说明该数组有鞍点 min_i = max.num[i] / lie; max_j = max.num[i] % lie; printf("\n鞍点位置: 第%d行第%d列\n",min_i + 1,max_j + 1); printf("鞍点值为: %d\n",arrays[min_i][max_j]); } //if } //for } //for if(!flag) { //说明数组无鞍点 printf("该数组无鞍点!\n\n"); } //if printf("**********************************\n"); return 0; } //main

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值