蜘蛛牌是windows xp作業系統自帶的一款紙牌遊戲,遊戲規則是這樣的:只能將牌拖到比她大一的牌上面(a最小,k最大),如果拖動的牌上有按順序排好的牌時,那麼這些牌也跟著一起移動,遊戲的目的是將所有的牌按同一花色從小到大排好,為了簡單起見,我們的遊戲只有同一花色的10張牌,從a到10,且隨機的在一行上展開,編號從1到10,把第i號上的牌移到第j號牌上,移動距離為abs(i-j),現在你要做的是求出完成遊戲的最小移動距離。
input
第乙個輸入資料是t,表示資料的組數。
每組資料有一行,10個輸入資料,資料的範圍是 1,
10 1,10
,分別表示a到10,我們保證每組資料都是合法的。
output
對應每組資料輸出最小移動距離。
sample input
11 2 3 4 5 6 7 8 9 10
sample output
9
這道題說實話真的不好想
為什麼那?
剛開始我認為把所有的情況都列出來就可以了,都算出來移動距離,找最小的就可以了
但是做的時候發現問題了
如何找乙個點應該移動到那個點?
如果1 2 那好辦,1移動到2,但是如果1 2 3 而我先2移動到3 ,那麼如何知道1要移動到3?
但是我看了大神的**,心中豁然開朗!
#includebool vis[15];
int id[15];
int min,num;
int abs(int a)
void dfs(int t,int num)
if(t==9) //如果移動夠9次就存下min
for(int i=1; i<10; i++) //正常的搜尋(參考素數環)
}vis[i]=false;}}
}int main()
dfs(0,0);
printf("%d\n",min);
}return 0;
}
下面來解釋一下
for(int j=i+1;j<=10;j++)//這個for迴圈目的是找選中的點應該移動到**
}
因為我剛開始選中了數字為1的點那麼我要找該移動到那個點
我從數字為2的點開始,如果這個點被選過了,為true 那麼說明2這個點已經找到3,並加在3後面了
如果3還是true 說明3也到4下面了,那麼我一直到第乙個是false 數值就可以把這個數放在下面了
當然,這一切的前提是我用了id[x]=i;這個特殊處理~
還有個問題
dfs(t+1,num+abs(id[j]-id[i]));
剛開始這我用的是
num+=abs(id[j]-id[i]);
dfs(t+1,num);
按理說是沒有區別的
但是我一不小心在最上面定義了乙個全域性變數num,這樣第二個就會wa,全域性變數會覆蓋區域性變數
這樣我的num值變成乙個全域性變數!但其實錯誤並不是這裡!
第二種方法是思路上有嚴重錯誤,在這次遞迴中num的值不能改變!
如果我採用第二種方法,那麼我遞迴回來到這個點的時候,num由於上次的使用變大了
這樣就會wa
但是我採用第一種,在我這次遞迴中,num的值並沒有變!並不影響下一次的使用!
一些程式設計上的小技巧
下面介紹的方法 程式設計珠璣 裡也有所提及 下面的例子是用python寫的,但這些概念適用於任何程式語言。找出程式的主執行路徑 你的程式大部分時間都執行這些模組。首先優化這部分 但也不要在程式實現的第一次迭代中進行優化。那些處理邊界情況或失敗 異常處理的地方,這部分 不需要優化,除非它們引起了值得注...
一些程式設計上的小技巧
下面介紹的方法 程式設計珠璣 裡也有所提及 下面的例子是用python寫的,但這些概念適用於任何程式語言。找出程式的主執行路徑 你的程式大部分時間都執行這些模組。首先優化這部分 但也不要在程式實現的第一次迭代中進行優化。那些處理邊界情況或失敗 異常處理的地方,這部分 不需要優化,除非它們引起了值得注...
在linux上用gdb除錯的小技巧
偶然發現竟然有這個玩法。首先一開始,terminal可顯示的行數實在有限,一些迴圈次數較多的需要快進的程式直接用終端是在不方便。因此我就想,將gdb的結果輸出到檔案會發生什麼呢。然後我就試了一下 justin justin music ics lab lab2 gdb bomb gdbbomb.lo...