Матрица C ++ - Получить количество столбцов, в которых самое низкое значение находится в той же строке, что и самое высокое значение в столбцах после него. - PullRequest
0 голосов
/ 28 декабря 2018

Я пишу программу на C ++, где вводятся значения N (количество деревень / рядов), M (количество дней / столбцов) и матрица H [N] [M], в которую я отдельно вводю температуру(мин. -50, макс. 50).

Выходными данными должно быть общее количество дней, когда деревня с самой низкой температурой имеет самую высокую прогнозируемую температуру, и после этого число (столбец) этих дней в восходящемпорядок.

Так что, если я введу что-то вроде этого:

3 5 
10 15 12 10 10
11 11 11 11 20
12 16 16 16 20

Вывод должен быть:

2 2 3

Или введите:

3 3
1 2 3
1 2 3
1 2 3

Вывод:

2 1 2

Мой подход состоял в том, чтобы сначала сохранить минимальные температуры и максимальные прогнозные температуры каждого дня в двух отдельных массивах, а затем написать цикл for, где я проверяю каждую деревню изо дня в день, если они содержат обаминимальное значение для данного дня и максимальное прогнозируемое значение температуры с этого дня.

У меня есть следующий код:

#include <iostream>

const int maxarr = 1000;
int H[maxarr][maxarr];

using namespace std;

void read(int N, int M, int t[maxarr][maxarr]);
void count(int N, int M, int t[maxarr][maxarr]);

int main()
{
    int N;
    int M;
    cout<<"Number of villages? ";
    cin>>N;
    cout<<"Number of days? ";
    cin>>M;
    read(N,M,H);
    count(N,M,H);

    return 0;
}

void read(int N, int M, int t[maxarr][maxarr])
{
    for(int i = 0; i < N ; i++)
    {
        for(int j = 0; j < M ; j++)
        {
            cin>>t[i][j];
        }
    }
}

void count(int N, int M, int t[maxarr][maxarr])
{
    int mintemparr[maxarr];
    int maxtemparr[maxarr];
    int mintemp;
    int maxtemp;
    int days[maxarr];
    int cnt = 0;

    for(int j = 0; j<M; j++)
    {
        mintemp = 51;
        for(int i = 0; i<N; i++)
        {
            if(t[i][j]<mintemp)
            {
                mintemp = t[i][j];
            }
            mintemparr[j] = mintemp;
        }
    }

    for(int i = 0; i < M-1; i++)
    {
        maxtemp = -51;
        for(int j = 0; j < N; j++)
        {
            for(int k = i+1; k < M; k++)
            {
                if(t[j][k]>maxtemp)
                {
                    maxtemp = t[j][k];
                }
            }
            maxtemparr[i] = maxtemp;
        }
    }
    for(int i = 0; i < M-1; i++)
    {
        for(int j = 0; j < N; j++)
        {
            for(int k = i+1; k < M; k++)
            {
                if(t[j][i] == mintemparr[i])
                {
                    if(t[j][k] == maxtemparr[i])
                    {
                        days[cnt] = i+1;
                        cnt++;
                        //tried an i++ here, didn't work as intended
                    }
                }
                else
                {
                    j++;
                }
            }
        }
    }
    cout<<cnt<<" ";
    for(int i = 0; i < cnt; i++)
    {
        cout<<days[i]<<" ";
    }
}

В некоторых случаях это работает идеально, напримерс первым входом он выводится так, как должно быть.Но со вторым вводом я получаю

6 1 1 1 2 2 2

и более длинный (1000x1000) ввод, который я, очевидно, не могу скопировать здесь, также дает неверные результаты.Как я могу заставить этот код работать как задумано?

1 Ответ

0 голосов
/ 28 декабря 2018

Причина, по которой вы получаете 6 1 1 1 2 2 2 для второго примера, заключается в том, что вы не останавливаетесь, чтобы проверить, соответствует ли определенный день условию, как только вы обнаружили, что оно выполнено.Таким образом, вы обнаружите, что в день 1 условие выполняется для деревни 1, деревни 2 и деревни 3 (первые три 1 в результате), а затем то же самое происходит для дня 2.

Из комментария

попробовал i ++ здесь, не работал как задумано

Я думаю, вы уже определили эту проблему, и i++ был предназначен для предотвращения повторной проверки в тот же день снова.Однако, как вы заметили, это само по себе не работает - причина в том, что при переходе к следующему дню необходимо убедиться, что в этот день проверка условия снова начинается с деревни 1, и поиск самой высокой температуры должентакже начните с самого начала.

Для этого просто добавьте

++i;   // carry on with the next day
j = 0; // start with the first village in the next iteration
k = i; // search for the highest temperature beginning from day i + 1
       // note that at the end of the loop body `k` will be incremented
       // so we need to use `k = i` instead of `k = i + 1` as in the loop-initializer here.

после cnt++ вместо комментария, который я цитировал выше.

С этим изменениемкаждый получит результат, который вы описали в вопросе для обоих случаев, как вы можете видеть здесь .

Учитывая данные, загруженные вами на zippyshare, я считаю, что выходные данные для второго примера действительно должны быть3 1 2 3 вместо 2 1 2.К счастью, код легко изменить, чтобы он соответствовал следующему: просто замените все k = i + 1 s на k = i и измените добавленные k = i на k = i - 1, чтобы поиск самых высоких прогнозов включал текущий день.

...