(百例编程)69.魔术师的猜牌术(1)

题目:魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。 对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信? 你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在 桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的 下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前 面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全 翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的?

//题目:魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。
/*对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?
你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在
桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的
下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前
面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全
翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的?*/
//BY as1138 2011-10-16

#include <iostream>
#include <queue>
using namespace std;

int main(void)
{
	queue<int> iQue;
	int ite[13];
	int len = 0;
	int tem;
    int tj;

	for (int i=0;i!=13;++i)
	{
		iQue.push(i);
	}

    for (int j=1;j!=14;++j)
	{
		len = iQue.size();
		tj = j;
		if (j>len)
		{
			if(j%len == 0)
				tj = len;
			else
			    tj = j%len;
		}
		for(int n=1;n<tj;++n)
       {
		    tem =iQue.front();
			iQue.pop();
		   iQue.push(tem);
       }
		tem = iQue.front();
		iQue.pop();
		ite[tem] = j;
	}

	int m = 0;
	while (m != 13)
	   cout<<ite[m++]<<" ";
	cout<<endl;
	
   return 0;
}
    原文作者:魔术师发牌问题
    原文地址: https://blog.csdn.net/csy981848153/article/details/7650140
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞