魔術師發牌問題(單迴圈鍊錶)

2021-10-03 17:15:50 字數 884 閱讀 7307

魔術師發牌問題,魔術師拿出13張黑桃撲克牌表演魔術,對底下觀眾講道,我只要數數就知道這張牌是什麼,然後數到1翻出來第一張a,並將a拿出來放到桌子上,用剩下的牌,重新數,數到2拿出來第2張牌...以此內推,求魔術師用怎樣的牌序才能達到此目的。

首先分析問題,我們可以得到乙個大致的類似鍊錶牌序為

1【】2【】【】3【】【】【】4【】【】【】。所以規律也很明顯了,於是我們就可以得到第二次的鍊錶整個迴圈的結果

1【】2【】3【】【】【】4【】【】.

所以用迴圈鍊錶解決問題,它的演算法應該是

for(int i =0;inext

} if(target->data==0)

仔細想一下這是不是有什麼問題,沒錯因為我們的牌有些是被放在了桌子上,所以我們在迴圈到這些牌的時候要跳過。

於是改進後的演算法

for(int i=1;inext;

//遇到被放到桌子上的牌就多迴圈一次指向下一位

if(target->data!=0

}所以核心的演算法其實就這麼簡單,然後就是具體的實現了,下面貼**:

#include

#include

typedef

struct node

node;

node *

create()

//簡單的單鏈表建立不做贅述了

target->next = head;

return head;

}void

margiccard

(node *head)

//主要的演算法}if

(target->data ==0)

}}void

main()

}

魔術師發牌問題 迴圈鍊錶

問題描述 魔術師手裡一共有13張牌,全是黑桃,1 13.魔術師需要實現乙個魔術 這是十三張牌全部放在桌面上 正面向下 第一次摸出第一張,是1,翻過來放在桌面上。第二次摸出從上往下數第二張,是2,翻過來 放在桌面上,第一張放在最下面去,等會兒再摸 第三次摸出從上往下數第三張,是3,翻過來放在桌面上,第...

魔術師發牌問題

說有乙個魔術師,他表演發牌的魔術,他將十三張黑桃牌放在一堆。然後開始數數,第一次,他數1,然後翻開第一張,果然是黑桃a,然後將黑桃a放到牌堆外。然後魔術師繼續數數,這次他數1,2,然後將數1的牌放到牌堆底,然後將數2的牌翻開,果然是黑桃2,然後將黑桃2放到一邊。繼續數1,2,3,果然每次都是對應的牌...

魔術師發牌問題

先搞清楚題意 注意按順序每翻到一張牌放到桌子上,不在手中了,其實是迴圈鍊錶的問題,可以在紙上模擬一下就可以得到牌開始的順序。1 一開始寫的比較麻煩 用兩個迴圈鍊錶,乙個放數字,乙個放序號,邊構造邊刪除,因為翻出來的牌已經放在一邊不在手上了,再用乙個card陣列存放開始的牌的順序。include st...