2

我是一名新程序员,当我遇到此错误时,我正在 codeforces 解决一个问题。

http://codeforces.com/contest/342/problem/A

我的算法工作正常,但我不知道为什么最后,我有一条错误消息和一个不同于 0 的返回值。如下图所示。

http://i.stack.imgur.com/sz9Jc.png

先感谢您 !!


这是我的算法:

#include <iostream>
#include <vector>
using namespace std;

void print(int a, int b, int c, int n) {
    for (int i=0;i<n;++i) cout<<a<<" "<<b<<" "<<c<<endl;
}

int main () {
    int n; cin>>n;
    vector<int> V(5);
    bool cont=true;
    for (int i=0;i<n;++i) {
    V[i]=0;
    }
    for (int i=0;i<n;++i) {
        int a; cin>>a;
        if (a==5 || a==7) cont=false;
        if (cont==true) {
            if (a==1) V[0]++;
            if (a==2) V[1]++;
            if (a==3) V[2]++;
            if (a==4) V[3]++;
            if (a==6) V[4]++;
        }
    }
    if (cont==false) {
        cout<<-1<<endl;

    }else {
        if (V[0]==V[1] && V[1]==V[3] && V[2]==0 && V[4]==0) {
            print(1,2,4,V[0]);
        }else if (V[0]==V[1] && V[1]==V[4] && V[2]==0 && V[3]==0) {
            print(1,2,6,V[0]);
        }else if (V[0]==V[2] && V[2]==V[4] && V[1]==0 && V[3]==0) {
            print(1,3,6,V[0]);
        }else if (V[0]==V[1] && V[1]==(V[4]+V[3]) && V[2]==0) {
            print(1,2,4,V[3]);
            print(1,2,6,V[4]);
        } else if (V[0]==V[4] && V[0]==(V[1]+V[2]) && V[3]==0) {
            print(1,2,6,V[1]);
            print(1,3,6,V[2]);
        } else if (V[0]==(V[1]+V[2]) && V[0]==(V[3]+V[4]) && V[3]==V[1]) {
            print(1,2,4,V[1]);
            print(1,3,6,V[2]);
        } else if (V[0]==(V[1]+V[2]) && V[0]==(V[4]+V[3]) && V[3]==(V[1]/2) && V[2]==(V[4]/2)){
            print(1,2,4,V[3]);
            print(1,2,6,V[1]-V[3]);
            print(1,3,6,V[2]);
        } else {
            cout<<-1<<endl;
        }
    }
    cout<<"fin"<<endl;
    return 0;
}
4

3 回答 3

3
   for (int i=0;i<n;++i) {
    V[i]=0;
    }

您应该检查n是 5 或更少。或者动态分配向量。如果n>5您导致堆损坏,则会导致您获得退出代码。

如果您将值n 用于其他内容并且只想初始化向量,则可以迭代

   for (int i=0;i<5;++i) 
于 2013-09-09T08:41:00.437 回答
2

对于您展示的示例,您的向量很小:

vector<int> V(5);

在那条线之后你清理向量

for (int i=0;i<n;++i) {
V[i]=0;
}

但在您的示例中,您需要九个元素。你用它破坏了堆。将第一行更改为

vector<int> V(n);

它将返回预期的 0。

于 2013-09-09T08:41:36.383 回答
1

您看到的退出代码 3221226356 转换为十六进制是 0xC0000374。谷歌搜索表明它是堆损坏的异常代码。您在清理某处出现错误并引发异常,然后该异常代码已作为您的进程退出代码出现。

于 2013-09-09T08:37:21.630 回答