魔术师发牌问题
【问题描述】
魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示。”
魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,然后顺序从上到下数手上的余牌,第二次数1,2,将第一张牌放在这些牌的下面,将第二章牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1,2,3,将前面两张依次放在这些牌的下面,再翻第三章牌正好是黑桃3。这样依次进行将13张牌全部翻出,准确无误。
【问】:牌的开始顺序是如何安排的?
【问题分析】
简单题,直接上图:
【代码实现】
/** * 魔术师发牌问题 * @Author CocoonFan * @date 2/28/2013 * */ #include <iostream> using namespace std; const int MAX_POKER = 13;//扑克牌的张数 int main() { int a[MAX_POKER] = {0};//定义13张扑克牌 int count(0);//计数器 int index(0);//游标 for(int i(1); i <= MAX_POKER; ++i){ while(true){ int j = index;//初始化当前位置 if(!a[j]){ ++count; } //构成循环 j = (j+1)%14; index = j;//记录当前位置 //插入扑克牌 if(count == i){ a[j-1] = i; count = 0; break; } } } //打印结果 for(int i = 0; i < MAX_POKER; ++i){ cout << a[i] << " "; } return 0; }
【结果】
1 8 2 5 10 3 12 11 9 4 7 6 13