小明剛上國小,學會了第一個撲克牌“魔術”,到處給人表演。魔術的内容是這樣的:
他手裡握着一疊撲克牌:A,2,....J,Q,K 一共13張。他先自己精心設計它們的順序,然後正面朝下拿着,開始表演。
隻見他先從最下面拿一張放到最上面,再從最下面拿一張翻開放桌子上,是A;然後再從最下面拿一張放到最上面,再從最下面拿一張翻開放桌子上,是2;......如此循環直到手中隻有一張牌,翻開放桌子上,剛好是K。
這時,桌上牌的順序是:A,2,3,4,5,6,7,8,9,10,J,Q,K
請你計算一下,小明最開始的時候手裡牌的順序是怎樣的。
把結果寫出來,逗号分割,小明“魔術”開始時,最下面的那張牌輸出為第一個資料。
考場不提供撲克牌,你隻能用計算機模拟了,撕碎草稿紙模拟撲克屬于作弊行為!另外,你有沒有把錄像倒着放過?很有趣的!回去試試!
參考答案:
7, A, Q, 2, 8, 3, J, 4,9, 5, K, 6, 10
最簡單粗暴的方法就是撕紙片,雖然題目不允許,不過題目的提示很明顯,就是逆過程,
正過程的第一步:從最底下拿一張牌到最上面。第二步:從最低下拿一張牌放到桌子上,
逆過程可以表示為,第一步:從桌子上拿一張牌到最底下。第二步,從最上面拿一張牌到最底下。
是以直接用數組模拟一下就好了,數組從左到右分别表示最上面和最下面,初始狀态隻有一個K(13),然後定義一個頭指針f,尾指針r,分别指向牌頂和牌底的下一個,每次插入的時候,先把數值賦給牌底,牌底指針加1,然後把牌頂的牌放到牌底,牌頂指針加1,牌底指針再加1,可以想象,最後把1插進去的時候,f就是牌頂,而r仍然是牌底的下一個,是以輸出的時候要從f到r-1。
注意兩個地方:1.數字與牌的對應關系,1-13分别對應A-K,2.題目要求答案是從牌底到牌頂的,不要搞反了。
#include<iostream>
using namespace std;
int main()
{
int a[100];
int f,r;
f=0,r=1;
a[0]=13;
for(int i=12;i>=1;i--)
{
a[r++]=i;
a[r++]=a[f++];
}
for(int i=f;i<r;i++)
{
cout<<a[i]<<' ';
}
return 0;
}