返回矩阵的值的C ++向量

时间:2018-03-28 14:13:49

标签: c++ algorithm

我有4个整数变量 - x,y,z,t可以从整数值[a,b]的区间中获取值(区间是a,a + 1,a + 2,..., b)。

我想使用以下规则设置不同{x,y,z,t}值的向量:

如果存在至少一个四重值,则两个四重奏(x和y)不相等:xi!= yi(i是{x,y,z,t}值位置之一)。

我目前的解决方案非常耗时:

struct gim
{
    int xx;
    int yy;
    int zz;
    int tt;
}
vector<gim> v;
x=a;y=a;z=a;t=a;
nr_quartet=0;
gim g;
while(x<=b)
{
    while(y<=b)
    {
        while(z<=b)
        {
            while(t<=b)
            {
                if(at least one of x,y,z,t is different)
                {
                    nr_quartet++;
                    g.xx=x;
                    g.yy=y;
                    g.zz=z;
                    g.tt=t;
                    v.push_back(g);
                    cout << x << " " << y << " " << z << " " << t << "\n";
                }
                t++;
            }
            z++;
        }
        y++;
    }
    x++;
}

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

int actual_t = t;
int actual_z = z;
int actual_y = y;
int actual_x = x;
while(t<=b && z <=b && y<=b && x<=b)
{
    if(at least one of x,y,z,t is different)
    {
        nr_quartet++;
        v.emplace_back(x, y, z, t);
        //cout << x << " " << y << " " << z << " " << t << "\n";
    }
    // For t
    if(t==b)
    {
        t = 0;
    }
    else
    {
        t++;
    }
    actual_t = t;

    // For z
    if(z==b)
    {
        z = 0;
    }
    else if(/* incrementation condition for z */)
    {
        z++;
    }
    actual_z = z;

    /* the same for y and x */
}

答案 1 :(得分:0)

如果您只需要集合{(x,y,z,t) | ¬(x = y = z = t)}的元素数量,那么请计算(b-a)**4 - (b-a);即无需迭代所有这些。

如果你真的需要用vector填充所有组合,那么你必须迭代才能将它们全部添加。最长的部分是std::vector内的内存分配,所以预先{ - 3}}或前 - reserve包含元素数量,因为您可以事先知道它。

  

据我所知,这是耗费大量时间的事情

你的意思是消耗了很多时间?你的[a, b]范围是什么?