[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...