2维矩阵中最小的3个元素

时间:2014-05-15 11:50:28

标签: c matrix

这里我在C

中找到2维矩阵中最小的3个元素时遇到了一些问题

这是我的代码:

for (i=0; i<r; i++) {
    for (j=0; j<c; j++) {
        if (m[i][j] < min1) {
            min1 = m[i][j];
            indexi_1 = i;
            indexj_1 = j;
        }
        if (m[i][j] < min2 && indexi_1 != i && indexj_1 != j) {
            min2 = m[i][j];
            indexi_2 = i;
            indexj_2 = j;
        }
    }
    for (j=0; j<c; j++) {
        if (m[i][j] < min3 && m[i][j] != m[indexi_1][indexj_1] && m[i][j] != m[indexi_2][indexj_2]) {
            min3 = m[i][j];
            indexi_3 = i;
            indexj_3 = j;
        }
    }
}

有这样的矩阵

int m[r][c] = {{33,  4, 23,  2}, {5,  3, 24, 16}, {8, 31,  7,  4},{10,  5,  2,  6}};

获得此输出:

 Local minimum (value=2) - row=0, column=3.
 Local minimum (value=2) - row=3, column=2.
 Local minimum (value=4) - row=0, column=1.

正如你在这里看到的那样,问题只出现在最后一个min元素中,我认为它因为索引而倾覆。

3 个答案:

答案 0 :(得分:0)

下面:

if (m[i][j] < min3 &&
    m[i][j] != m[indexi_1][indexj_1] &&
    m[i][j] != m[indexi_2][indexj_2])

您比较值而不是索引。

答案 1 :(得分:0)

您将第三个最小值与 temporary min1min2的值进行比较。您必须在外部for循环

之后移动第三个循环
for (i=0; i<r; i++) {
    for (j=0; j<c; j++) {
        if (m[i][j] < min1) {
            min1 = m[i][j];
            indexi_1 = i;
            indexj_1 = j;
        }
        if (m[i][j] < min2 && indexi_1 != i && indexj_1 != j) {
            min2 = m[i][j];
            indexi_2 = i;
            indexj_2 = j;
        }
    }
}

for (i=0; i<r; i++) {
    for (j=0; j<c; j++) {
        if (m[i][j] < min3 && m[i][j] != m[indexi_1][indexj_1] && m[i][j] != m[indexi_2][indexj_2]) {
            min3 = m[i][j];
            indexi_3 = i;
            indexj_3 = j;
        }
    }
}

现在最后一个循环将与最后的前两个最小值进行比较。

答案 2 :(得分:0)

更改此行

if (m[i][j] < min3 && m[i][j] != m[indexi_1][indexj_1] && m[i][j] != m[indexi_2][indexj_2])

if (m[i][j] < min3 && (indexi_1 != i && indexj_1 != j) && (indexi_2 != i && indexj_2 != j))