|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
输出应该为4 1 8 ,我这里为什么会越界?输出奇怪的数字呢?
- int main()
- {
- int num[6][6];
- int minv,maxv,flag;
- for(int i=1;i<6;i++)
- for(int j=1;j<6;j++)
- cin>>num[i][j];
- for(int i=1;i<6;i++)
- for(int j=1;j<6;j++)
- cout<<num[i][j]<<" ";
- cout<<endl;
- for(int i=1;i<6;i++)
- for(int j=1;j<6;j++)
- {
- flag=1;
- num[i][j]=minv=maxv;
- for(int k=1;k<6;k++)
- if(num[k][j]<minv)flag=0;
- for(int m=1;m<6;m++)
- if(num[i][m]>maxv)flag=0;
- if(flag) cout<<num[i][j]<<" ";
- }
- cout<<endl;
- if(!flag)cout<<"no found"<<endl;
- return 0;
- }
复制代码
第18行
num [j]=minv=maxv;
为什么要覆盖数组元素?
我在网上找了一段代码,你看看别人是如何实现的
- #include <stdio.h>
- #define M 50
- #define N 50
- int main(void)
- {
- int i, j, m, n;
- int max, jmax, flag, f = 1;
- int a[M][N];
- scanf("%d%d", &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)
- {
- max = a[i][0];
- jmax = 0;
-
- for(j = 1; j < n; ++j) // 找出i行最大的
- {
- if(max < a[i][j])
- {
- max = a[i][j];
- jmax = j; // 且记录所在的列坐标
- }
- }
- flag = 1; // 预置标志
- for(j = 0; j < m && flag; ++j) // 判断max是否为所在列最小的
- {
- if(a[j][jmax] < max) // 不是
- flag = 0; // 则清标志
- }
- if(flag == 1)
- {
- printf("鞍点:a[%d][%d] = %d\n", i, jmax, max);
- f = 0;
- }
- }
- if(f)
- printf("没有鞍点。\n");
- return 0;
- }
复制代码
|
|