魔術師發牌問題,魔術師拿出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...