我试图在二维(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
如何解决? 以及如何在最后一个元素中添加零(正如您在新数组的第一个表中看到的那样)。
答案 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