前面用迭代不知道為什麼出錯,後來改用遞迴
演算法思想:
首先若木棒長度和不是4的整數倍則不可能構成正方形,逐條邊填充,如遇到一條邊不能填充則cut
考慮幾種分支情況:
如果當前邊剩餘空間為0
若剩餘木棒也為0,則已經填充完畢(此時一定恰好填充了4條邊)
否則填充下一條邊
對每條邊設立使用標記,從未使用的第一條邊開始逐個填入,填入時將訪問標記設為true(之後歸還),遞迴填其餘邊
如果剩餘木棒可以填充在剩餘空間中,則直接返回true
如果不能填充,取消當前木棒,若當前木棒已經填滿某條邊,則其餘木棒不用再填充(取掉之後也一樣)
如果下一條木棒和當前木棒相同,則也不用比較
**:
# include # include # include # include using namespace std;
int edgelength = 0;
vectorstickstorage;
vectorusage;
bool pathfinder(int stickremain, int spaceremain, int subscription)
spcr = edgelength;
subscription = 0;
} int size = stickstorage.size();
for ( int i = subscription ; i < size; i++ )
usage[i] = false;
if ( stickstorage[i] == spcr || spcr == edgelength ) //if the current stick fills a line, there's no need to compare any more
while ( stickstorage[i] == stickstorage[i+1] && i < size-1 )
}} return false;
}int main()
sort(stickstorage.begin(),stickstorage.end(),greater());
if ( sum%4 != 0 )
else
if ( possible )
else
}return 0;
}
彎曲的木棍
總時間限制 1000ms 記憶體限制 65536kb 描述 1 n c l 輸入輸入包含多行,每行輸入包括3個非負數 細木棍的初始長度l,溫度的變化n,材料的熱膨脹係數c。輸入資料保證細木棍伸長的長度不會超過原長的一半,最後一行為3個 1,不做處理。輸出對每一行輸入,輸出細木棍的中心在受熱前後移動的...
oj 木棍問題
題目如圖所示 為了避免處理小數誤差,將資料 100處理,二分查詢找到測試長度,然後直到二分區間左右端點相鄰,再測試哪個端點滿足要求,最後換成保留2位小數處理。如下 testb.c testb created by ke tang on 2018 9 19.include include stdlib...
遞迴 木棍問題
問題描述 喬治拿來一組等長的木棒,將它們隨機地裁斷,使得每一節木棒的長度都不超過50 個 長度單位。然後他又想把這些木棒恢復到裁截前的狀態,但忘記了初始時有多少木棒以及木 棒的初始長度。請你設計乙個程式,幫助喬治計算木棒的可能最小長度。每一節木棒的長度 都用大於零的整數表示。輸入資料 由多個案例組成...