看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《linkone (小豆豆)》之銘言: : 題目網址:http://www.tcgs.tc.edu.tw/~sagit/luckycat/q10067.htm : 這種有無限多種排列組合的題目真的是我想到死都想不出來 : 想了好幾種方式去掃但是好像都會有Bug : 目前想到的方法是: : 2 : 8 0 5 6 : 6 5 0 8 : 5 : 8 0 5 7 : 8 0 4 7 : 5 5 0 8 : 7 5 0 8 : 6 4 0 8 : 掃出禁止數目裡 個位數 十位數 百位數 千位數 裡沒有的數字 然後找出最短可以到達的 : 例如 個位數禁止數字裡 沒有 1 2 3 4 5 6 9 : 6往上調7就不行 所以往下調到五 只要調到五 其他的就可以直接調上去 : 但是我這樣一次只有考慮一個位數 不曉得這樣會不會有bug.. : 還是這是有牽扯到資料路徑問題..... 資料結構方面是一維的陣列int ary[10000]; // 0 ~ 9999 用來記錄到達此數字要轉幾步。 0 0 0 0 當成0 1 2 3 4 當成1234 初始化ary所有是-1,代表輪盤還未被轉到,或並未具意義。 那麼起始輪盤ary[8056] = 0; 目標輪盤ary[6508] = -3; 禁止輪盤ary[8057] = -2; ary[8047] = -2; ... 等等非常多。 轉輪盤的程序: int d[2] = {1, -1}; // 轉右或轉左 for(int 位數 = 0; 位數 != 4; ++位數) // 0 ~ 3 for(int j = 0; j != 2; ++j) 轉輪盤函數(目前輪盤, 位數, d[j], 下一個輪盤); 將下一個輪盤轉換成數字:假設是8057好了。 如果ary[8057] == -3,達到目標。 ary[8057] == -1,ary[8057] = 轉輪盤的步數。 ary[8057] == -2,禁止,BFS不必處理。 ary[8057] == 某個正數(代表前次轉到的步數),BFS不必處理。 BFS的實作方式希望您能上網查資料或查書。 提示可以用queue來實作,不必處理就代表不必再放到queue裡。 : 還有另外一題 給你 ax+by=d d為a跟b的最大公約數 找出|x|+|y|的最小值 : .... 上網看是歐基里德擴展演算法 .... 看都看不懂~ . ~ : 不曉得有沒有解釋較清楚的網站.. 麻煩各位嚕 這個wiki或google都有現成的程式碼................... Bleed -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.115.229