没想到吧,又是学校的作业qwq
找鞍点
【题目描述】
输入一个m行n列的整型数组(m,n从键盘输入,m,n均大于0小于20),求出这个数组的“鞍点”。鞍点是指这个元素在所处的行上最大,列上最小。请输出这个鞍点的位置及鞍点的值(鞍点有可能有多个,多个鞍点,输出时每个鞍点的信息独立成行)。如果没有鞍点,请输出No.
其实自己凭感觉的话直接最佳解就出来了,但是当时一是没列步骤,写算法流程,二是自己懒得动手就直接在网上“借鉴”了一部分,经过简单修改如下
#include<stdio.h>
#define M 20
#define N 20
int main()
{
int a[M][N];
int i, j,m,n;
int flag= 0, temp1[M], temp2[N];
scanf("%d %d",&m,&n);
for (i = 0; i<m; i++)
for (j=0; j<n; j++)
{
scanf("%d", &a[i][j]);
}
//处理数组,temp1为行,temp2为列
for (i = 0;i < m;i++)
{
temp1[i] = a[i][0];
temp2[i] = a[0][i];
for (j = 0;j < n;j++)
{
if (temp1[i] < a[i][j]) temp1[i] = a[i][j];
if (temp2[i] > a[j][i]) temp2[i] = a[j][i];
}
}
for (i = 0;i < m;i++)
{
for (j = 0;j < n;j++)
{
if (a[i][j] == temp1[i] && a[i][j] == temp2[j])
{
printf("(%d,%d)=>%d\n",i,j,a[i][j]);
flag++;
}
}
}
if(!flag)
printf("No.");
}
在处理数据那个位置,因为考虑不周,会出现例如m=3,n=4。但列的值直接赋值给了a[4][3]超出数组的位置了,所以会产生错误。在通过检查后发现了这问题,将代码改成如下
#include<stdio.h>
#define M 20
#define N 20
int main()
{
int a[M][N]= {0};
int i, j,m,n;
int flag= 0, temp1[M], temp2[N];
scanf("%d %d",&m,&n);
for (i = 0; i<m; i++)
for (j=0; j<n; j++)
{
scanf("%d", &a[i][j]);
}
//处理数组,temp1为行,temp2为列
for (i = 0; i < m; i++)
{
temp1[i] = a[i][0];
for (j = 0; j < n; j++)
if (temp1[i] < a[i][j])
temp1[i] = a[i][j];
}
for(i=0; i<n; i++)
{
temp2[i] = a[0][i];
for(j=0; j<m; j++)
if (temp2[i] > a[j][i])
temp2[i] = a[j][i];
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (a[i][j] == temp1[i] && a[i][j] == temp2[j])
{
printf("(%d),(%d)=>%d\n",i,j,a[i][j]);
flag++;
}
}
}
if(!flag)
printf("No.");
}
总有一天,我也要成为大佬。加油!奥里给!!!!!!!
2019/12/27
整挺好,同学写的代码比我这个好,不用我那个数组做,确实需要学习
#include <stdio.h>
#define M 20
#define N 20
int main()
{
int a[M][N],i,j,k,q,m,n,flag,FLAG,max;
flag=1;
FLAG=0;
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];
for(j=0; j<n; j++)
{
if(max<a[i][j])
{
max=a[i][j];//如果哪里有比他大的就开始重新赋值
}
}
for(q=0; q<n; q++)//在找的的这行开始横着来
{
if(a[i][q]==max)//如果有和最大值相等的值,就开始竖着来
{
for(k=0; k<m; k++)//开始竖着来
{
if(a[k][q]<max)//如果有任何一个比他小,退出循环
{
flag=0;
break;
}
}
if(flag==1)
{
printf("(%d,%d)=>%d",i,q,max);
printf("\n");
FLAG=1;
}
}
}
}
if(FLAG==0)
printf("No.");
return 0;
}