需要在忽略对角线的情况下找到 4x2 数组的最小值

Need to find the minimum value of a 4x2 array while ignoring the diagonal

我需要找到不在主对角线上的数组中的最低值,我已经编写了一些代码,但它似乎只选择第二个或最后一个值(取决于哪个是最低值).

这是我的代码:

#include<iostream>
using namespace std;
int main()
{
    int arr[4][2];
    int Min,i,j;
    cout<<"Type 8 numbers";
    for (i=0;i<4;i++)
    {
        for (j=0;j<2;j++)
        {
            cin>>arr[i][j];
            Min=arr[0][1];
            if(i!=j and Min > arr[i][j])
            {
                Min=arr[i][j];
            }
        }
    }
    cout<<"The values of the array are: \n";
    for (i=0;i<4;i++)
    {
        cout<<"\n";
        for (j=0;j<2;j++)
        {
            cout<<arr[i][j]<<"\t";
        }
    }
    cout<<"The lowest value is: "<<Min;
}

如果我键入 1-8,则返回值为 2,如果我键入 8-1,则返回值为 1,在这两种情况下,代码都按我的预期工作,但如果我键入类似 8 的内容, 6,4,1,2,3,4,5,返回的最低值为 5,我是编码新手,希望得到任何帮助。

Min=arr[0][1];

不好因为

  • i = 0, j = 0时读取未初始化的arr[0][1]
  • 它无条件地将arr[0][1]写入Min,即使当前Min小于Min

而不是这个:

Min=arr[0][1];
if(i!=j and Min > arr[i][j])
{
    Min=arr[i][j];
}

这会起作用,例如:

if(i!=j and ((i==0 and j==1) or Min > arr[i][j]))
{
    Min=arr[i][j];
}

你的 Min=arr[0][1] 行在两个循环内,这意味着每次当你试图比较 Min 和当前元素 arr[i][j] 时,你只是丢弃了存储在 [=13] 中的任何最小值=] 并将其替换为 arr[0][1].

因此您编写的代码 returns 最后一个数字或 arr[0][1],以较小者为准。

你真的应该只在你的循环开始之前初始化这个 Min 一次。即

Min = arr[0][1]
for(i = 0; i < 4;i++)
{
    for(j = 0; j < 2; j++)
    {
     // Compare Min and arr[i][j] and reassign the smaller one to Min if i != j
    }
}