一個撲克牌的問題 |
尚未結案
|
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
弟寫了個小程式可以處理, 你先 check 一下結果 (1~20) 對不對, 晚點整理好再 post 上來: Result: 1
Result: 2 1
Result: 2 1 3
Result: 4 1 3 2
Result: 3 1 5 2 4
Result: 5 1 4 2 6 3
Result: 4 1 6 2 5 3 7
Result: 8 1 5 2 7 3 6 4
Result: 5 1 9 2 6 3 8 4 7
Result: 8 1 6 2 10 3 7 4 9 5
Result: 6 1 9 2 7 3 11 4 8 5 10
Result: 11 1 7 2 10 3 8 4 12 5 9 6
Result: 7 1 12 2 8 3 11 4 9 5 13 6 10
Result: 11 1 8 2 13 3 9 4 12 5 10 6 14 7
Result: 8 1 12 2 9 3 14 4 10 5 13 6 11 7 15
Result: 16 1 9 2 13 3 10 4 15 5 11 6 14 7 12 8
Result: 9 1 17 2 10 3 14 4 11 5 16 6 12 7 15 8 13
Result: 14 1 10 2 18 3 11 4 15 5 12 6 17 7 13 8 16 9
Result: 10 1 15 2 11 3 19 4 12 5 16 6 13 7 18 8 14 9 17
Result: 18 1 11 2 16 3 12 4 20 5 13 6 17 7 14 8 19 9 15 10
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi Gorden Peng 您好:
提供一個比較沒效率的方式
procedure TForm1.Button1Click(Sender: TObject); var NumList : Array of Integer; NumCount, i : integer; CountList, ResultList : TStringList; begin NumCount := 20; CountList := TStringList.Create; ResultList := TStringList.Create; for i := 1 to NumCount do CountList.Add(IntToStr(i)); i := 0; while CountList.Count <> 0 do begin inc(i); while i > CountList.Count -1 do i := i - CountList.Count; ResultList.Add(CountList.Strings[i]); CountList.Delete(i); end; SetLength(NumList, NumCount); for i := 0 to NumCount - 1 do NumList[StrToInt(ResultList.Strings[i])-1] := i 1; for i := 0 to NumCount - 1 do Memo1.Lines.Add(inttostr(NumList[i])); ResultList.Free; CountList.Free; end;我想這可能要用鏈結串列的做法會比較快, 或是有其他演算法, 我的做法是土法煉鋼, 模擬發牌, 所以程式長長一串 我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
Gorden Peng
一般會員 發表:11 回覆:11 積分:4 註冊:2002-03-18 發送簡訊給我 |
謝謝兩位高手的指點,連程式碼都寫好了,實在是有心,再次說聲謝謝。我在網路上有找到下列文章,貼上來給大家參考:
/*****************************************************************
巧排順序
將1—K共13張牌,表面上看順序已亂(實際上已按一定順序排好),將其第1張放到第13張後面,取出第2張,再將手中的牌的第1張放到最後,取出第2張,如此反復進行,直到手中的牌全部取出為止,最後向觀眾展示的順序正好是
1,2,3,……,10,J,Q,K.
請你試試看!
撲克牌的順序為:7,1,Q,2,8,3,J,4,9,5,K,6,10.
你知道這是怎麼排出的嗎?
這是“逆向思維”的結果,將按順序1,2,3,4,5,6,7,8,9,10,J,Q,K排好的撲克牌按開始的操作過程反向做一遍即可.
司馬光砸缸的故事你早已聽說過吧!孩子掉入水缸,常人一般考慮是讓孩子離開水,而司馬光砸缸是讓水離開孩子,這就是逆向思維,巧排撲克牌的順序也是逆向思維。
*********************************************************************/
現在的問題是這個遊戲能導出一個數學公式與否?
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
dear all,
好玩的題目, 這題好多年前我用撲克牌玩過,
現在我提供我的解法 (C version) 供大家參考
< class="code">
const int nTotal = 13; // 喜歡幾項都可以 int Perm[nTotal];
for ( int i = 0; i < nTotal; i)
Perm = 0; int nIdx = 0;
int nSkip = 0;
int nFill = 1;
while (nFill <= nTotal)
{
if (0 < nSkip)
{
if (0 == Perm[nIdx])
{
Perm[nIdx] = nFill ;
nSkip = 0;
}
}
else
{
if (0 == Perm[nIdx])
nSkip;
}
nIdx;
if (nTotal-1 < nIdx)
nIdx = 0;
}
[i]*真實的事物最美, 簡單的道理最好, 我能體會的 太少* 發表人 - royce520 於 2003/10/24 14:54:28
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |