发布时间:2023-12-29 04:09来源:www.sf1369.com作者:宇宇
// 首先来看你之前的代码
for (i=0;i<m;i++) // for A
{
i1=i;
for (max=a[i][0],j=0;j<n;j++) // for B
{
if (max<a[i][j])
{
max=a[i][j];
}
}
for (j=0;j<n;j++) // for C
{
for (min=a[i][j],i=0;i<m;i++) // for D
{
if (min>a[i][j])
{
min=a[i][j];
}
}
i=i1;
if (a[i][j]==max&&a[i][j]==min)
{
printf(a[%d][%d]=%d ,i,j,a[i][j]);
flag++;
}
}
}
/************************************************************************/
/*
首先我们知道在矩阵中,鞍点的定义是这样的“在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点”
所以我们就按照这个要求来求去所有的鞍点
执行的逻辑是先找到每行的最大值,然后看看这个值在所在列的最小值,如果这两个数在同一个位置则表示这个数是一个鞍点数据
1、执行for A 是为了执行每一行
2、执行for B是为了在第i行中找出最大值的位置和最大的那个值。但是我们发现在对i行的各列遍历完得到第i行最大值之后会执行 for C和for D 这两个过程会变化i, 则需要事先将i保留出来(其实也可以在这两个for里面定义新的变量用i初始化)
3、for C 执行的是对每个列的遍历,效果如同for A。找到第j列的最小值,然后将之前保留的i(保存到了i1中)重新赋值回来,然后比较得到最终的结果
4、其实这个过程明显就已经出现了无用功。 因为在for C中我们其实只要看看外面的for B获取的那个最大值的列索引的值在这列的所有行中是不是最小的就可以了
*/
/************************************************************************/
// 下面执行鞍点搜索
int jindex = -1;
for (i=0;i<m;i++) // for A
{
// 遍历i行的所有数据, 找到第i行中最大的数据和所在的列索引
for (max=a[i][0],j=0, jindex=j;j<n;j++) // for B
{
if (max<a[i][j])
{
max=a[i][j];
jindex = j;
}
}
// 对前面搜索到的列索引, 看a[i][jindex] 在jindex列中是否为最小的
bool the_a_i_jindex_is_min = true;
for (int ii=1; ii<m; ii++)
{
if (max > a[ii][jindex])
{
the_a_i_jindex_is_min = false;
break;
}
}
if (the_a_i_jindex_is_min)
{
printf(a[%d][%d]=%d is AnDian\n, i, jindex, a[i][jindex]);
flag++;
}
}