|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
求求大佬救救孩子,寻找鞍点问题,意思是一个二维数组中,如果一个数在其所在行中最大,但在其所在列最小,则为鞍点。要求输出该数,以及其所在的行、列,最难的要求是重复也算,
例如: 1 2 2
1 3 3
1 4 4
输出要求为: 2 第一行 第二列
2 第一行 第三列
下面是我的代码,无法解决重复问题,求大佬救救孩子
#include<stdio.h>
//寻找鞍点,以3*3数组为例
#define M 3
#define N 3
int main()
{
int a[M][N]; //初始二维数组
int i,j,k; //循环计数
int m,temp; //筛选中间量
printf("输入数组数值(%d个):\n",M*N);
for(i=0;i<M;++i)
for(j=0;j<N;++j)
scanf("%d",&a[i][j]);
//校检输入是否符合预期
printf("校检如下:\n");
for(i=0;i<M;++i)
{
printf("第%d行:",i+1);
for(j=0;j<N;++j)
{
printf(" %d ",a[i][j]);
}
printf("\n");
}
//筛选鞍点
for(i=0;i<M;i++) //每行
{
m = a[i][0];
for(j=0;j<N;++j)
{
if(a[i][j]>m)
{
m = a[i][j];
temp = j;
}
}
for(k=0;k<M;++k)
{
if(m>a[k][temp])
{
printf("第%d行无鞍点\n",i);
break;
}
}
if(k==M)
{
printf("鞍点: %d 第%d行,第%d列\n",m,i+1,temp+1);
}
}
return 0;
}
此题目是谭浩强《C语言程序设计》的课后习题。下面的程序,是我学习时写的,本不想翻旧帐,两天了,没有人回答你,程序还是给你吧(你要的是 3 x 3 ,将定义中的 M、N 改为 3 即可):
- #include <stdio.h>
- #define M 10 //最大接收M行N列的数组,这里是10*10,可修改。
- #define N 10
- int main()
- {
- int a[M][N], b[N];
- int i, j, k, s, max, min, count = 0;
- //下面用来接收数组的输入
- printf("输入数组元素:");
- 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++)
- {
- printf("%5d", a[i][j]);
- }
- printf("\n");
- }
- //查找判断鞍点
- for (j = 0;j < M;j++)
- {
- max = a[j][0];
- for (i = 0;i < N;i++) // 找第j行最大值
- if (a[j][i] > max)
- max = a[j][i];
- s = 0;
- for (i = 0;i < N;i++) //将最大值所在的列存入数组b[s]中
- if (a[j][i] = max)
- {
- b[s] = i;
- s++; //s的值就是最大值的个数
- }
- min = max;
- for (i = 0;i < s;i++) //有几个最大值循环判断几次
- {
- for (k = 0;k < M;k++)//判断这个行最大值是不是列最小
- if (min > a[k][b[i]])
- break;
- if (k == M) //输出,count为鞍点个数
- printf("鞍点为第%d行第%d列的%d\n", j + 1, b[i] + 1, a[j][b[i]]);
- count++;
- }
- }
- }
复制代码
|
|