天天看點

藍橋杯 結果填空 巧排撲克牌 數組模拟

小明剛上國小,學會了第一個撲克牌“魔術”,到處給人表演。魔術的内容是這樣的:

他手裡握着一疊撲克牌: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;
}
           

繼續閱讀