0
#include<stdio.h>
int l;
int check(int m[][l],int a,int r,int c,int e)
{
    int t,i,j;
    for(i=0;i<c;i++)
    {
        if(m[a][i]==e)
            return 1;
    }
    for(i=0;i<c;i++)
    {
        for(j=0;j<r;j++)
        {
            if(a!=j)
            {
                if(m[a][i]==m[j][i]&&m[a][i]!=-1)
                {
                    m[a][i]=-1;
                    return check(m,j,r,c,e);
                }
            }
        }
    }
    return 0;
}
int main()
{
    int t;
    int i,j;
    scanf("%d",&t);
    for(t;t>0;t--)
    {
        l=0;
        int n,e,a,b,x,y;
        scanf("%d%d%d%d",&n,&e,&a,&b);
        int m[e][n];
        l=n;
        for(i=0;i<e;i++)
        {
            for(j=0;j<n;j++)
            {
                m[i][j]=-1;
            }
        }
        for(i=0;i<e;i++)
        {
            scanf("%d%d",&x,&y);
            for(j=0;j<((n-y)/x)+1;j++)
            {
                m[i][y+(j*x)]=y+(j*x);
            }
        }
        int v,g=0;
        for(i=0;i<e;i++)
        {
            for(j=0;j<n;j++)
            {
                if(m[i][j]==a)
                {
                    v=check(m,i,e,n,b);
                    g++;
                    break;
                }
            }
        }
        if(v==1)
        {
            printf("It is possible to move the furniture.\n");
        }
        else if(v==0||g==0)
            printf("The furniture cannot be moved.\n");
    }
    return 0;
}

「n<=50000 の値に対して正しい答えを取得しています。それ以上の値を指定すると、実行時エラーが発生します」「http://www.spoj.pl/problems/SCRAPER/ のコードを書きました「.. ideone で実行すると、より多くの 'n' 値に対して「実行時エラー」として回答が得られました

4

3 に答える 3

1

スタックで利用可能なメモリよりも多くのメモリを割り当てようとしているため、スタック オーバーフローが発生します。malloc通常、このような巨大な配列は、callocまたはを使用して動的に割り当てる方がはるかに優れていますrealloc

次の質問を確認してください: C: サイズと printf() の呼び出しに応じた配列初期化のセグメンテーション違反

于 2012-06-28T07:46:04.000 に答える
0

「int m[e][n]」と書くと、配列の実空間は1!'e' 'n' が両方とも 0 の場合、配列のスペースはコンパイル時に定義されます。m[10​​00 ][1000] のように、配列の長さとしてマクロを使用する必要があります。そして、e<1000 であることを確認する必要があります。

于 2012-06-28T08:00:13.300 に答える
0

配列はスタックに格納される場合があり、通常、スタックはヒープよりも小さくなります。配列を動的に割り当てるようにしてください ( malloccallocfree)。

于 2012-06-28T07:53:45.903 に答える