C ++在二维数组

时间:2015-12-14 07:05:17

标签: c++ arrays multidimensional-array max min

我试图在二维(4,4)数组中找到min(按行)和max(按列)元素,然后将它们存储在新数组(5,5)中。

它应该如何寻找新的数组(5,5):

1 2 3 4 min
5 6 7 8 min
4 4 4 5 min
3 5 5 6 min
m m m m  0

* m - max

这是整个代码:

#include <iostream>
using namespace std;
int main() {
    int A[4][4];/*First array*/
    int i, j;


    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++) {
            cout << "\n A[" << i + 1 << "][" << j + 1 << "]=";
            cin >> A[i][j];
        }

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4; j++)
            cout << A[i][j] << "\t";

        cout << "\n";
    }
    {
        int min[4];/* find min on each row*/
        for (i = 0; i < 4; i++) {
            min[i] = A[0][i];
            for (j = 1; j < 4; j++) {
                if (min[i] > A[i][j])
                    min[i] = A[i][j];
            }
        }
        int newarr[5][5];/* here i create the new array 5,5)*/
        int max[5] = { 1,2,3,4,5 };
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                newarr[i][j] = A[i][j];
                newarr[i][5] = max[i];
            }
        }

        for (j = 0; j < 4; j++)
            newarr[5][j] = min[j];
        cout << newarr[5][j] << "\t";
        cout << "\n";
}

}

我把随机元素放到最大值。因为到目前为止我只测试。但是,一旦我开始我的程序,它只显示正确的第一个数组。新数组应该在哪里显示为零。这是调试的结果:

5   4   3   1   
5   6   7   9   
4   2   3   9   
4   8   4   6   
0   

如何解决? 以及如何在最后一个元素中添加零(正如您在新数组的第一个表中看到的那样)。

2 个答案:

答案 0 :(得分:2)

您可以通过所有元素一次性完成:

// returns a (rows+1, cols+1) matrix
int* make_min_max_vectors(const int* arr, size_t rows, size_t cols) {
    size_t out_size = (rows+1) * (cols+1);
    int* res = malloc(out_size * sizeof(int));

    // set up initial values in the right/bottom vectors
    res[out_size - 1] = 0;

    for (size_t col = 0; col < cols; ++col)
        res[rows*(cols+1) + col] = INT_MIN;

    for (size_t row = 0; row < rows; ++row)
        res[row*(cols+1) + cols] = INT_MAX;

    for (size_t row = 0; row < rows; ++row)
        for (size_t col = 0; col < cols; ++col) {
            const int* cell = &arr[row*cols + col];

            res[row*(cols+1) + col] = *cell; // copy
            if (*cell < res[row*(cols+1) + cols]) // min
                res[row*(cols+1) + cols] = *cell;
            if (*cell < res[rows*(cols+1) + col]) // max
                res[rows*(cols+1) + col] = *cell;
        }
    }
    return res;
}

也就是说,您只需遍历所有输入元素一次,将每个输入元素复制到输出中,并检查每个输入元素是否小于其最小行数或大于其最大列数。你不需要min和max的临时向量,也不需要在整个输入上运行两次。

答案 1 :(得分:0)

John Swincks的答案很棒(+ 1&#39; d)我肯定会建议他的答案只是为了将来验证你的代码。我自己编程并且理解上面的代码看起来有多么令人生畏(尤其是malloc)。因此我编写了一个非常相似的代码版本,但是不需要使用原始的4x4矩阵而是使用5x5。代码如下所示,如果您有任何问题,请告诉我。代码可以按原样编译,并将演示您尝试实现的目标。

#include <iostream>

int main()
{
    // Initialised inline to simplify example.
    int A[5][5] = {0};

    // Only uses 4x4 of the 5x5 array meaning that you don't need to use two arrays.
    for (int x = 0; x < 4; ++x)
    {
        for (int y = 0; y < 4; ++y)
        {
            std::cout << "Enter in value for row " << x << ", column " << y << ".\n";
            std::cin >>  A[x][y];
        }
    }

    std::cout << "Input:" << std::endl;
    for (int x = 0; x < 4; ++x)
    {
        for (int y = 0; y < 4; ++y)
        {
            std::cout << A[x][y] << "\t";
        }
        std::cout << "\n";
    }

    // Finds the max down each column in the array
    for (int x = 0; x < 4; ++x)
    {
        for (int y = 0; y < 4; ++y)
        {
            if (A[x][4] < A[x][y])
                A[x][4] = A[x][y];
        }
    }

    // Finds the min across the array (along row) 
    for (int y = 0; y < 4; ++y)
    {
        for (int x = 0; x < 4; ++x)
        {
            // Assign the min to a value in that row.
            A[4][y] = A[1][y];
            if (A[4][y] > A[x][y])
                A[4][y] = A[x][y];
        }
    }

    std::cout << "Output:" << std::endl;
    for (int x = 0; x < 5; ++x)
    {
        for (int y = 0; y < 5; ++y)
        {
            std::cout << A[x][y] << "\t";
        }
        std::cout << "\n";
    }

    std::cin.get();
    std::cin.get();
    return 0;
}

修改:示例输入和输出以便澄清。

Input:
1       2       3       4
5       62      4       6
8       9       1       2
4       6       8       9
Output:
1       2       3       4       1
5       62      4       6       4
8       9       1       2       1
4       6       8       9       4
8       62      8       9       0