HDU 蜘蛛牌(方法上的小技巧)

2021-07-29 03:46:29 字數 1722 閱讀 4277

蜘蛛牌是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

1

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