分配

时间:2017-09-09 11:26:43

标签: c++ memset

我遇到了一个问题:“多次测试(t测试),每次测试打印所有长度为N的字符串,并且正好包含H数字1。”

这是我的代码:

#include <iostream>
#include <memory.h>

using namespace std;

typedef long long LL;

LL t,N,H;
LL arr[1000];
bool used[1000];
LL num = 0;

void show(){
    LL number = 0;
    for (LL u = 0; u<1000; u++)
    {
        if (arr[u]==2)
        {
            number++;
        }
    }
    if (number==H)
    {
        for (LL v = 0; v<1000; v++)
        {
            if (arr[v])
            {
                cout << arr[v] - 1;
            }
        }
        cout << "\n";
    }
}

void backtrack (LL pos){
    if (pos==N+1)
    {
        num = 0;
        show();
        return;
    }
    if (!used[pos])
    {
        for (LL j = 1; j<=2; j++)
        {
            if (j==2)
            {
                if (num==H)
                {
                    break;
                }
                else
                {
                    num++;
                }
            }
            arr[pos] = j;
            used[pos] = true;
            backtrack(pos+1);
            used[pos] = false;
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin >> t;
    for (LL i = 0; i<t; i++)
    {
        cin >> N >> H;
        //memset(arr, sizeof(arr), 0);
        for (LL cv = 0; cv<1000; cv++)
        {
            arr[cv] = 0;
        }
        backtrack(1);
        if (i<t-1)
        {
            cout << "\n";
        }
    }
    return 0;
}

我在使用“memset(arr,sizeof(arr),0)时遇到了麻烦;” - 它返回了错误的答案。但是使用相同的测试,当我使用for循环将数组“arr”中的所有元素分配为0时,它返回了正确的答案。

我的测试是: 2 4 2 3 1

我想知道memset和for循环之间的区别(用于赋值)。感谢。

2 个答案:

答案 0 :(得分:3)

memset有三个参数。第一个是指向要填充的内存块的指针(你的arr),第二个是要设置的值,第三个是要填充的字节数。Here memset的文档,如果你想更深入的话 在你的代码中我读了

memset(arr, sizeof(arr), 0)

读作&#34;用sizeof&#34;的值填充0字节。
你只能给出错误的参数,它应该是:

memset(arr, 0, sizeof(arr))

答案 1 :(得分:1)

memset的第二个参数应该是,第三个是size。使用此:

memset(arr, 0, sizeof(arr) );

有关详细信息,请参阅this