C++ ACM-reliable networking

#include<iostream>

using namespace std;

//the form is int[] = m,n

void getcase(int* mn){//get each two integer case(M,N)

cin>>mn[0]>>mn[1];

}

//the final form should be

//int[] = -1, A, r1,r2, ... -1, B, rx,ry, ...[-2]

int* compute(int* mn){//set org first

int *count, *ans;

int q=0;

int n = mn[0], m = mn[1], ci = 1, alltime = 0, ai = 0;

count = new int[n*2];

ans = new int[2*n*(n-1)];

//set orginal form first

for(int s=0;s<n*2-1;s+=2){

count[s] = ci;

count[s+1] = 0;

ci++;

}

//count and set in ans[]

int b=n;

for(int a=0;a<2*n-2;a+=2){

while(count[a+1]<m+1){

if(count[a] != b){

ans[ai] = count[a];

ans[ai+1] = b;

count[a+1]++;

count[b*2-1]++;

ai+=2;

alltime++;

}

if(count[b*2-2]>count[a]+1)

b--;

else

b=n;

}

}

ans[ai] = alltime;

ans[ai+1] = -1;

/*

for(int k=0;k<n*2;k++)

out<<"count="<<count[k]<<endl;

for(int k=0;ans[k]!=-1;k++)

cout<<"ans="<<ans[k]<<endl;

cout<<alltime;

*/

return ans;

}

int main(){

int T, t=0, k=0;

int mn[2],**ans;

//get T's cases

cin>>T;

for(t=0;t<T;t++){

getcase(mn);

ans[t] = compute(mn);

}

//show the final answer

for(int j=0;j<T;j++){//i can't find the problem

for(int l=0;ans[j][l+1]!=-1;l+=2)

cout<<ans[j][k]<<" "<<ans[j][k+1];

cout<<j<<" "<<k;

cout<<endl;

}

/**/

system("PAUSE");

return 0;

}

最近在做的問題,不過問題不大,為了讓高手們能跑,小弟放上程式碼

主要的問題是這樣:倒數第10行那裏我打了一個//i can't find the problem

就是說我想要用指標去抓出我處理好的陣列,只是執行的時候會出錯

但是我如果直接cout<<ans[]...一個一個印出來卻又可以直行(它就是不讓我跑回圈)

搞不懂也!(20點搂!)

1 個解答

評分
  • 1 0 年前
    最佳解答

    你的問題出在你沒給 ans RAM!

    所以,要

    do

    { cout << "asdf: ";

    cin >> T;

    } while (T < 1);

    ans = new int *[T];

    if (ans == NULL)

    return 1;

    且在 最後的 return 0; 前要

    delete [] ans;

    不過,你有另一個問題:你在 compute 裡 new 的〝都〞沒有 delete!

    關於 ans 的要在上述的 delete 前加上

    for (t=T; --t>=0; )

    delete [] ans[t];

    關於 compute 裡的 count,要在 return ans; 前加上

    delete [] count;

    其它我就沒看囉!

    祝 成功 ^_^

還有問題?馬上發問,尋求解答。