公路重建問題

2021-07-05 03:41:41 字數 1414 閱讀 5195

[1]可以知道,距離最大的一定是從第乙個點到最後乙個點的.那麼我們將第乙個點的座標定為0,最後乙個點的座標定為10.

[2]接下來刪除集合中的距離10,那麼該集合就是由n-1個點構成的距離集合.接下來,再去最大的距離,很顯然,距離8可以是乙個點到x0的距離,也可以是點到x6的距離.這時候有兩種情況,因此我們要進行回溯演算法來試探可能的解.

[3]首先試探點x1 = 8,的情況,刪除所有的x1與現有點集中所有點對應的距離,比如d = 8,d = 2.如果在刪除的時候發現沒有對應的距離,就得出這個組合不行,試探點在右邊的情況.如果還是不行,就返回上次試探的結果,將上一次的試探復原.進行另外的試探.

#include "stdafx.h"

#include "math.h"

#include "malloc.h"

#include "string.h"

#define false -1

#define true 1

int index[15];

int find(int distance,int d,int n)

return -1;

}int findmax(int d,int n)

if(i==-1)

return -1;

} int place(int x,int d,int n,int left,int right)

dmax = findmax(d,m);

//判斷dmax對應的點是在左邊還是右邊

for (int i = 0;i<=n-1;i++)

else

if ((iright))

d[index] = -1;//暫時刪除

}if (mark == true)//所有已知的|x[i] - dmax都在d中

memcpy(d,copy,sizeof(int)*15);

mark = true;

for (int i = 0;i<=n-1;i++)

else

if ((iright))

d[index] = -1;

}if (found == false&&mark == true)

memcpy(d,copy,sizeof(int)*15);

free(copy);

return found;

} int turnpike(int x,int d,int n )

else

return false;

}int _tmain(int argc, _tchar* argv)

; turnpike(x,d,6);

return

0;}

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

第一次錯誤 pos start dmax printf dmax d n dmax for i 0 i分析 漏掉了found在遞迴時仍然不符合要求的情況,應該在遞迴結束後仍然檢測found值,0則仍然回溯 新增 如下 if found for i 0 i第二次錯誤 新增 位置錯誤,導致重複回溯 po...

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

通過點與點之間的距離重新構造出點集。距離集大小為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...