此題目的:
看到很多篇文章把這到問題寫的不清不楚的,今天特意把這個題目敘述給大家,然後自己先想一想要怎麼做。再來看題解。
某天,有個魔術師從一套完整的卡牌將13張張桃卡牌全部拿了出來,洗好了牌之後,展示給眾人說,他對眾人說,我不用看牌,只需要數數,就可以知道這張牌是什麼,於是他把13張牌牌面向下,「第一張牌是黑桃a」,他如此說道,然後把黑桃a扔到桌子上,此時手上還有12張牌,然後他又說道「從上往下數第二張牌是黑桃2」,他把從上往下數的第一張牌拿到第12張牌,也就是最後一張牌的下面(沒有看),然後翻看第二張牌,果真是是 黑桃2,然後他有說了「
從上往下數第三張牌是黑桃3」,於是他把前面兩張牌按照原來的順序放在最後一張牌的下面,翻開了第三張牌,
果真是是 黑桃3,然後魔術師又把這張 黑桃3 扔到桌子上,就這樣,反反覆覆,翻開了 13 張牌,魔術師說的每一張牌都是準確的,那麼,他是怎麼做到的呢?
問題轉化:
其實就是乙個魔術師在做翻牌之前,他是怎麼放牌的問題。
首先,我們注意到,魔術師每次翻看完撲克牌以後,就把它扔到桌子上了,那麼總的牌數就會減少。
其次,我們還注意到,每次魔術師翻看撲克牌之前都會把上面不翻看的撲克牌放到最下面。
魔術師做了三個動作,放牌 翻牌 扔牌,就這麼重複這三種動作,所以答案肯定就在這個過程裡面,假設我們固定 13 個盒子,將其標號為 1 - 13,如果盒子裡面的撲克牌被翻看了,就為這個盒子蓋上黑布,不准再碰了也不能在數數的時候算他乙個,我們發現 當我們翻看 黑桃a 2 3 4 的時候,都是在 13 以內的,但是要翻 黑桃5 時,發現已經到最後乙個盒子了,怎麼辦呢?我們想想魔術師怎麼做的?---(放牌),沒錯,我們倒回去,從 1 號盒子開始,但是 1 號盒子已經被翻過了,不能再動它了,那這時候怎麼辦呢?死鬼,放聰明點,我們跳過這個 1 號格仔不把它,到下乙個盒子去,如果下乙個盒子還這樣我們繼續跳過,前面留了這麼多空,總會有沒有翻過牌的盒子吧!(注意:無形中我們使用到了迴圈)
一張圖看看:
需要用到迴圈,需要使用鍊錶所以我們在開始解這項魔術之前要先定義迴圈鍊錶哦!
#include #include #include #include #define n 13
using namespace std;
//定義鍊錶結構體
typedef struct nodenode,*linklist;
//初始化迴圈鍊錶
linklist initlinklist(linklist l)
return l;
}int main()
p->data = i;
} p = l->next;
//遍歷
while(p!=l)
}
怎麼樣?有趣吧!是的,學演算法也可以這麼有趣! 銀翼的魔術師
看名偵探柯南的故事還要追溯到上個世紀,我記得應該是98年的時候,上海開始播出名偵探柯南的電視連續劇,沒有記錯的話,是下午18 30分開始。因為我總是要趕在這個時候回家,為了看柯南。再次看柯南是2003年,我在盜版商那裡買了一部 貝克街的亡靈 回家一看,大呼過癮!自此才知道原來柯南有電影版和電視版的區...
魔術師猜數
在一種室內互動遊戲中,魔術師要每位觀眾心裡想乙個三位數abc a b c分別是百位 十位和個位數字 然後魔術師讓觀眾心中記下acb bac bca cab cba五個數以及這5個數的和值。只要觀眾說出這個和是多少,則魔術師一定能猜出觀眾心裡想的原數abc是多少。例如,觀眾甲說他計算的和值是1999,...
魔術師發牌問題
說有乙個魔術師,他表演發牌的魔術,他將十三張黑桃牌放在一堆。然後開始數數,第一次,他數1,然後翻開第一張,果然是黑桃a,然後將黑桃a放到牌堆外。然後魔術師繼續數數,這次他數1,2,然後將數1的牌放到牌堆底,然後將數2的牌翻開,果然是黑桃2,然後將黑桃2放到一邊。繼續數1,2,3,果然每次都是對應的牌...