線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1834
推到 Plurk!
推到 Facebook!

一個撲克牌的問題

尚未結案
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-13 09:26:46 IP:163.28.xxx.xxx 未訂閱
我有1~13張牌 按照一種順序牌完後 將最上面的第一張拿到最下面,然後將第二張翻開,牌面為1 再將第三張拿到最下面,翻開第四張,牌面為2 依此類推,將牌全部翻開後,牌面順序為1~13 請問一下,這種順序如何導出一個公式? 並且能夠將牌的總數順序一值延伸到14張.15張.16張.....N張? P.S一定要先將第一張拿到最下面 先說聲謝謝了。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-20 19:19:23 IP:203.95.xxx.xxx 未訂閱
弟寫了個小程式可以處理, 你先 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-20 23:01:22 IP:218.160.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-22 09:33:37 IP:163.28.xxx.xxx 未訂閱
謝謝兩位高手的指點,連程式碼都寫好了,實在是有心,再次說聲謝謝。我在網路上有找到下列文章,貼上來給大家參考: /***************************************************************** 巧排順序 將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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-24 14:52:46 IP:61.59.xxx.xxx 未訂閱
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
------
不要忘記呼吸,不要忘記編程! ∩__∩
系統時間:2024-05-03 9:43:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!