收費公路重建問題,回溯 遞迴

2021-07-23 23:01:25 字數 1295 閱讀 7411

第一次錯誤:

pos[start]=dmax;printf("dmax:%d\n",dmax);

for(i=0;i分析:漏掉了found在遞迴時仍然不符合要求的情況,應該在遞迴結束後仍然檢測found值,0則仍然回溯;新增**如下

if(!found) for(i=0;i第二次錯誤:新增**位置錯誤,導致重複回溯

pos[start]=dmax;printf("dmax:%d\n",dmax);

for(i=0;i#include #include #include #define maxposnum 15

typedef struct distance

*disset;

disset initializeq(int);

disset createq(int);

void initializearr(int );

int turnpike(disset,int );

int findmax(disset);

int deset(int,disset);

int place(int,int,disset);

int atset(int,disset);

int isempty(disset);

void enset(int,disset);

void printd(disset);

int main()

int isempty(disset d)

int place(int start,int pos,disset d)

}int atset(int ele,disset d)

void printd(disset d)

int turnpike(disset d,int pos)

else

printf("ff");

return 0;

}int findmax(disset d)

int deset(int ele,disset d)//返回被刪除的元素,即第乙個引數

void initializearr(int pos)

return d;

}disset initializeq(int n)

一點感悟:網上常看到「數學是演算法的基礎」,但是實踐以來,發現很長一段路,考察的是乙個人的邏輯和條例。學習演算法不該本末倒置「先打好數學基礎,在學習演算法」,應該遇到瓶頸時,在去學習。

另:大學期間一定要打好數學基礎,可能工科的所有學問(至少計算機),想要學到一定高度,數學和英語都是必備的。英語!!!數學!!!

回溯演算法 收費公路重建問題

通過點與點之間的距離重新構造出點集。距離集大小為n n 1 2,n為點的個數。驅動程式 include include include using namespace std bool turnpike vector x,multiset d,int n else return false 回溯部分...

回溯演算法(收費公路重建問題)

給出乙個距離的集合d,求出在x軸,存在哪些點能夠組合成這樣的距離集合 假設第乙個點在0處 path 1 0 最後乙個點是距離集合中最大的距離 path n max d 使用堆或是紅黑樹存放距離集合d include include include using namespace std bool p...

公路重建問題

1 可以知道,距離最大的一定是從第乙個點到最後乙個點的.那麼我們將第乙個點的座標定為0,最後乙個點的座標定為10.2 接下來刪除集合中的距離10,那麼該集合就是由n 1個點構成的距離集合.接下來,再去最大的距離,很顯然,距離8可以是乙個點到x0的距離,也可以是點到x6的距離.這時候有兩種情況,因此我...