Нахождение минимума и максимума в двумерных массивах?

После запуска этого кода он сгенерирует случайный массив нужных строк и столбцов. Затем цикл разделит массив по диагонали на верхнюю и нижнюю стороны. В верхней части цикл будет искать max number и в нижней части петля будет искать min number , Затем на заключительном этапе мне нужно изменить позиции min а также max , Max на месте min и наоборот. Код запускается и находит min а также max.Не знаю, как поменять местами.

Код

#include <iostream>
#include <time.h>
#include <limits.h>using namespace std;

int main(){
int rows, columns;
int max = INT_MAX;
int min = INT_MIN;
int XindexOfMax, YindexOfMax;
int XindexOfMin, YindexOfMin;

cout << "Enter rows: ";
cin >> rows;
cout << "Enter columns: ";
cin >> columns;

int **array = new int *[rows];            //generating random array
for(int i = 0; i < rows; i++)
array[i] = new int[columns];

srand((unsigned int)time(NULL));         //generating randoms

for(int i = 0; i < rows; i++){           //loop for the main array
for(int j = 0; j < columns; j++){
array[i][j] = rand() % 10;
cout << array[i][j] << " ";
}
cout << "\n";
}

cout << "For finding Max: " << endl;

for(int i = 0; i < rows; i++){             //upper half of the diagonal
for(int j = 0; j < columns - i; j++){
cout << array[i][j] << " ";
if(array[i][j] > max){
max = array[i][j];
XindexOfMax = i;              //find x and y coordinates if max
YindexOfMax = j;
}

}
cout << "\n";
}
cout << "For finding Min: " << endl;

for (int i = 0; i < rows; i++){          // lower half of the diagonal
for (int j = 0; j < columns; j++){
if (j < columns - i - 1){
cout << "  ";
}
else{
cout << array[i][j] << " ";
if(array[i][j] < min){
min = array[i][j];
XindexOfMin = i;       //find x and y coordinates if min
YindexOfMin = j;
}
}
}
cout << "\n";
}
cout << "Result" << endl;
//swapping positions of min and max
std::swap(array[XindexOfMax][YindexOfMax], array[XindexOfMin][YindexOfMin]);

for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
cout << array[i][j] << " ";   //Printing the final array
}
cout << "\n";
}
return 0;
}

0

Решение

В добавок к min а также max значения, вы должны помнить, где вы нашли min а также maxсоответственно. Затем вы можете обменять значения (вручную или с помощью std::swap).

Кстати: вам нужно инициализировать max а также min с INT_MIN а также INT_MAXсоответственно и не наоборот.
Так должно быть

int max = INT_MIN;
int min = INT_MAX;

В противном случае, если вы напишите int max = INT_MAXтогда нет сравнения как if(array[i][j] > max) будет когда-либо оценивать как истину, так как нет интегрального значения, превышающего INT_MAX,

1

Другие решения

Я верю, что это сделает то, что вы просите. Обмен выполняется в конце main () с использованием std :: swap ().

Я разбил пару процедур на функции. Ответ можно было бы улучшить, если разбить больше функций, чтобы каждая функция выполняла одну задачу. Тем не менее, я добавил класс, но попытался сохранить верность вашему оригинальному дизайну для печати половинок треугольника. Ницца. Надеюсь, что вы можете обрабатывать некоторые классы на этом этапе

#include <iostream>
#include <time.h>
#include <limits.h>
#include <cmath>

using namespace std;

class Point {
public:
Point(int x, int y, int value) : x(x), y(y), value(value) {}
int X() { return x; }
int Y() { return y; }
int Value() { return value; }
void SetValue(int valueArg) { value = valueArg; }
void SetPoint(int xArg, int yArg, int valueArg) {
x = xArg;
y = yArg;
value = valueArg;
}

string to_string() {
return std::to_string(value);
}

private:
int x;
int y;
int value;
};

void PrintArray(int **array, int rows, int columns) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
cout << array[i][j] << " ";
}
cout << "\n";
}
}

int main() {
int rows, columns;
cout << "Enter rows: ";
cin >> rows;
cout << "Enter columns: ";
cin >> columns;
int **array = new int *[rows];    //generating random array
for (int i = 0; i < rows; i++)
array[i] = new int[columns];
srand((unsigned int) time(NULL));
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
array[i][j] = rand() % 10;     //generating randoms
}
}
PrintArray(array, rows, columns);
Point maxPoint = Point(0, 0, INT_MIN); // initialize max
Point minPoint = Point(0, 0, INT_MAX);;
cout << "For finding Max: " << endl;
for (int i = 0; i < rows; i++) {            //separating the upper half
for (int j = 0; j < columns - i; j++) {
if (j > columns - i) {
cout << array[i][j] << " ";
} else {
cout << array[i][j] << " ";
if (array[i][j] > maxPoint.Value()) {
maxPoint.SetPoint(i, j, array[i][j]);
}
}
}
cout << "\n";
}
cout << "For finding Min: " << endl;
for (int i = 0; i < rows; i++) {         //separating the lower half
for (int j = 0; j < columns; j++) {
if (j < columns - i - 1) {
cout << "  ";
} else {
cout << array[i][j] << " ";
if (array[i][j] < minPoint.Value()) {
minPoint.SetPoint(i, j, array[i][j]);
}
}
}
cout << "\n";
}
cout << "array before: " << endl;
PrintArray(array, rows, columns);
cout << "Swapping " << "maxPoint(" << maxPoint.X() << ", " <<
maxPoint.Y() << ") with minPoint("<< minPoint.X() << ", " << minPoint.Y() << ")" << endl;
std::swap(
minPoint.GetCellReference(array),
maxPoint.GetCellReference(array));
PrintArray(array, rows, columns);
return 0;
}

Как упомянуто в одном из комментариев, std :: swap () является одним из методов выполнения свопинга. Я изменил пример, чтобы использовать std: swap () в конце main ();

Удачи.

0

По вопросам рекламы [email protected]