2013-04-05 18 views
1

所以我認爲我在正確的軌道上使用分支和綁定方法來解決我的啓發式問題 解決方案,但是,我在我的「最少」函數中出現了分段錯誤,但是我仍然很難將這個算法考慮在內。任何幫助解決這個問題將不勝感激。基本上對功能的要求(因爲我的主要功能看起來很有趣)是程序最多需要150個城市,如果讀取時間不到60秒,我會得到獎勵積分(這意味着我沒有失敗),輸入文件將顯示(例如): c 1 c 2 a 1 2 300 其中'c'表示「創建城市」,'a'表示「添加邊界」。這就是爲什麼我的程序是按照它的方式設置的。分支和綁定問題的C代碼

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int cost=0; 
int main(){ 
int numcity ,a[151][151],visited[151],worthless,city1,city2,distance; 
char citystring[2]; 
    a[1][1]=0; 
    while(scanf("%s",citystring) != EOF){ 
    if(strcmp(citystring, "c") == 0){ 
    scanf("%d", &worthless); 
    numcity++; 
    } 
    else if(strcmp(citystring, "a") == 0){ 
    scanf("%d %d %d",&city1,&city2,&distance); 
    a[city1][city2] = distance; 
    a[city2][city1] = distance; 
    } 
    } 
    mincost(1,numcity,a,visited); 
    printf("The minimum cost tour is %d",cost); 

    return 0; 
} 

int mincost(int city,int n,int a[151][151],int visited[151]){ 
int i,ncity; 
    visited[city]=1; 
    printf("%d->",city); 
    ncity=least(city,n,a,visited); 
    if(ncity==999999){ 
    ncity=1; 
    printf("%d",ncity); 
    cost+=a[city][ncity]; 
    } 
    mincost(ncity,n,a,visited); 
} 

int least(int c,int n,int a[151][151],int visited[10]){ 
int i,nc=999999,min=999999,kmin; 
    for(i=1;i<=n;i++){ 
    if((a[c][i]!=0)&&(visited[i]==0)){ 
     if(a[c][i]<min){ 
     min=a[i][1]+a[c][i]; 
     kmin=a[c][i]; 
     nc=i; 
     } 
    } 
    } 
    if(min!=999999) 
    cost+=kmin; 
    return nc; 
} 
+0

你的代碼肯定有幾個問題。第一次mincost遞歸沒有任何出路(這就是爲什麼你現在崩潰)。第二,正如吉姆所說,至少你的for循環()從1開始。可能有其他的,但是一次只處理一個,並且根據需要添加儘可能多的printf跟蹤。你會得到它。 – 2013-04-05 23:46:05

回答

0

你的程序核心轉儲在mincost()的最後一行,這是對mincost()的遞歸調用。

崩潰的原因是你吹(溢出)的堆棧。

你有無限循環的遞歸等價物。

什麼時候應該mincost返回?

0

C數組是0索引的,但是你的索引從1..n而不是0 ..(n-1)...這就是你爲什麼聲明爲151而不是150?

但是你的崩潰可能是由於mincost無條件地調用自己。你說你認爲自己處在正確的軌道上,但是在算法上纏繞頭腦麻煩......我認爲這些陳述是不一致的。在確認編碼之前,你應該確定你已經理解了算法。