撲克洗牌 No 69

2021-08-26 13:49:22 字數 1981 閱讀 7715

給你一副牌,牌的張數為 n ,把它分成 k 堆,每一堆有 t = ( n / k )張 (假定n 能夠被 k 整除)。分法如下:從牌的底部取 t 張給第一堆(順序不變),再從底部取 t 張給第二堆,,,,最後把剩餘的 t 張牌給最後一堆。比如,一副牌為 a b c d e f (順序從上到下),如果把牌分成三堆,第一堆為 e f, 第二堆為 c d,第三堆為 a b。

把牌分好以後,然後再重新合成一幅整牌,合成一副牌的方法如下:從第一堆開始,每次從每一堆裡取最頂上一張,把取的牌按照先後順序放在一起,也就是說,後取的牌放在先取的牌下面,重複這樣做,直到每一堆都沒有牌剩餘。從分牌到合牌這乙個過程叫做洗牌。

當初我們把牌a b c d e f 分成了三堆,第一堆為 e f, 第二堆為 c d,第三堆 為 a b,那麼合成一幅牌以後,順序為 e c a f d b。

問題:給你一副張數為 n 的牌, 把它 分成 k 堆, 需要洗牌多少次,才能讓牌變成一樣?比如,如果原始牌為 a b c d e,這裡 n = 5, 如果把它分成 5 堆, 這裡 k = 5,所以,第一次洗牌後,牌的順序變為 e d c b a, 再次洗牌,順序變成 a b c d e, 所以,對於 n = 5, k = 5, 我們只需要 2 次洗牌就可以復原。

分析:假定這副牌用乙個 int 陣列 card[n] 表示,那麼,撲克牌的原始順序就是從 0 開始到 n - 1。 洗牌以後,card[n] 中數字的位置出現了變化,要判斷是否撲克牌已經復原,我們只需要判斷 card[i] 是否等於 i 即可。**如下:

// check whether the card is in the original order     

public static boolean thesame(int array)

}return same;

}

因為洗牌的時候,我們需要把牌分成 k 堆,實際上,我們不需要構建 k 個陣列來儲存這些牌,我們只需要建立乙個大小為 k 的陣列 pointer[k] ,pointer陣列儲存的是每乙個堆在card陣列的起始位置。比如 n = 6, k = 2, 那麼第一堆的其實位置為 4, 第二堆的起始位置為 2, 第三堆的起始位置為 0,也就是說 pointer [k] = 。每一次洗牌,我們都需要從每乙個堆裡取牌,所以,我們建立另乙個陣列 temp [n] 來臨時儲存洗牌後牌的順序。每次洗完牌,都檢視是否和原始牌的順序一致,不一致,繼續洗牌,直到洗牌後的順序和原始順序一致。

洗牌的**如下:

/**

* * @param size: the size of each pile of cards

* @param k: the number of piles of cards

*/public static void shuffle(int card, int temp, int pointer, int size, int k)

}}

計算洗牌次數的**如下:

public static int shuffletimes(int n, int k) 

int pointer = new int[k];

int temp = new int[n];

int size = n / k; // the size of each pile of cards

for (int i = 0; i < k; i++)

shuffle(card, temp, pointer, size, k);

// exchange card and temp

int exchange = card;

card = temp;

temp = exchange;

int counter = 1; // the shuffle times

while (thesame(card) == false)

return counter;

}

撲克洗牌演算法

最近看到了遇到面試題,內容是以最快的方法將一副撲克牌重洗?覺得挺有意思,總結了三種方法,下面的的 是用js,呵呵,下面是 functionshuffle 洗牌方法1 this.shuffle1 function returnarr3 最簡單粗暴的一種方法 this.shuffle2 function...

撲克洗牌演算法

card list for i in range 1 55 card list copy.deepcopy card list 為保證原資料不被改變,對原列表進行深拷貝乙份 for i in range 1 54 index random.randint i,54 card list i 1 car...

撲克牌洗牌樣例

從網上摘抄的乙個洗牌程式的樣例 清雨空間與您分享程式設計的樂趣 以下是乙個基於c語言編寫的隨機 洗牌程式,程式先按順序生成一副紙牌,顯示紙牌,輸入洗牌次數,開始隨機洗牌,顯示洗牌結果 program by norm jen,include include includeint card 2 52 i...