看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《hank951 (法克)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : C : 問題(Question): : 想了解大概要怎麼思考這種題型 : 餵入的資料(Input): : 輸入一個整數 例如3或4 : 預期的正確結果(Expected Output): : if 3 : 000 : 001 : 010 : 011 : 012 : if 4 : 0000 : 0001 : 0010 : 0011 : 0012 : 0100 : 0101 : 0102 : 0110 : 0111 : 0112 : 0120 : 0121 : 0122 : 0123 : 補充說明(Supplement): : 這種格式若是要思考用遞迴(backtracking)要怎麼下手比較好呢 http://codepad.org/mk3FG9J6 思考完規律以後,可以先想辦法把它畫成樹狀圖。 level 0 0 / \ 1 0 1 / \ /|\ 2 0 1 0 1 2 ... ... /|\.... 3 0 1 2 畫完以後就可以想想,這圖和程式碼的關係為何: 1.當前節點是個要印的數字 // int number 2.每條邊是 function-call, 所以如果當前節點有 3 條邊連接子節點就要放個迴圈跑 3 遍。 // for (...) { back_tracking(...); } 3.觀察規律得知,子節點的數量 是 到目前為止最大數 + 2, 所以迴圈要跑這麼多次。 // if (max_number < number) max_number = number; // for (i : max_number + 2) 4.在葉節點結束,所以要設終止條件。 // if (level + 1 == depth) { return; } 5.在結束時要把路徑上遇到的數字印出來,所以路徑上的數字要存進 buffer。 // char buffer[BUFFER_SIZE]; // buffer[level] = '0' + number; // if (is leaf) { cout << buffer << endl; } 應該很清楚了吧。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.66.250.21 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1422137882.A.B3E.html