C ++矩阵-获取列数,其中最小值与在其后的列中的最大值在同一行中

时间:2018-12-28 00:25:36

标签: c++ arrays matrix

我正在用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 :(得分:0)

在第二个示例中获得6 1 1 1 2 2 2的原因是,一旦发现某天满足条件,您就不会停止检查该天是否满足条件。因此,您发现在第1天,村庄1,村庄2和村庄3满足了条件(结果中的前三个1s),然后在第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++之后

代替我上面引用的评论。

通过此更改,您将获得在两种情况下您在问题中描述的输出,如您所见here

鉴于您上传到zippyshare的输入,我相信第二个示例的输出确实应该是3 1 2 3而不是2 1 2。幸运的是,代码很容易更改以适应以下要求:只需将所有k = i + 1替换为k = i,然后将新添加的k = i更改为k = i - 1,以便搜索最高的预测包括今天。