【猜牌算法】魔术师的游戏

Description

魔术师手中有m张牌,牌的编号为1-n,魔术师预先将牌排好后迭在一起,牌面朝下。对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听。不信?你们就看。

魔术师按顺序从上到下数手中的牌,第一次数1,将第一张牌(最上面的那张牌)翻过来放到桌面,正好是牌1。第二次数1、2,将第一张牌放到这迭牌的下面,将第二张牌翻过来放到桌面,正好是牌2。第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌放到桌面,正好是牌3。这样依次进行,将n张牌全翻过来,准确无误。问魔术师手中的牌原始次序是怎样安排的?

Input

输入第一行为一个整数T(1<=T<=10),表示有T组测试数据;

对于每组测试数据格式如下:
第一行为1个整数n(1<=n<=26)。
Output

为每个测试样例单独一行输出魔术师手中牌的原始次序,每个牌号之后跟一个空格。

Sample Input
5
1
2
3
4
13 
Sample Output
1 
1 2 
1 3 2 
1 4 2 3 
1 8 2 5 10 3 12 11 9 4 7 6 13 

解题思路:
数组num用来储存牌,index表示当前下标。
1.初始化,牌位里面都为空,0;
2.第一个位置放1,依次往后数第n个空位(也就是说非空的不算在内)放牌n,到达数组尾部 就跳回下标为0继续循环

实现代码:
#include<iostream>
using std::cin;
using std::cout;
using std::endl;

int main() {
    int num[26];
    int T, n, total, index;
    cin >> T;  //T个测例 
    for (; T > 0; T--) {
        cin >> n;
        for (int i = 0; i < 26; i++) 
		     num[i] = 0;           //初始化置空 
        num[0] = 1;                //第一个肯定放1 
        index = 1;
        for (int i = 2; i <= n; i++) {
            for (total = 0; total < i; ) {  //total用来表示当前第几个空牌位 
               if (num[index] == 0) 
			       total++;
               if (total == i) 
			       break;
               if (index == n - 1)      //到达数组尾部跳回头部 
			       index = 1;
               else index++;
            }
            num[index] = i;           //放牌 
        }
        for (int i = 0; i < n; i++) {
            cout << num[i] << ' ';
        }
        cout << endl;
    }                                                                                                                                            
}                                 
 
  

  (本博文或多或少参考过其他网上资料,但时间已久忘记当初的参考了,在此对他们表示感谢!)

 

转载于:https://www.cnblogs.com/zengyh-1900/p/4064172.html

### 回答1: 然后将牌堆中的每一牌都数一遍,最后翻开牌堆,每牌都是黑桃。观众惊叹不已,但其实这是一种叫做“牌堆记忆法”的魔术技巧。魔术师事先将牌堆排好序,然后通过记忆每牌的位置,再加上一些花式表演,让观众产生错觉,以为他真的能够猜到每牌的花色和点数。 ### 回答2: 这个魔术的核心在于魔术师利用了一种叫做“逆推法”的数学方法。逆推法是一种反向思维的方法,就是从结果往前推导,通过已知的结果不断逆推,最终推导出原来的解题方法或者答案。 对于魔术师猜牌术,具体来说,他事先把13黑桃牌按顺序排好,这个顺序也是逆推法的关键。然后他从1开始数数,每数一下,就把牌翻转一,也就是把最上面那牌翻过来。这样,逆推法的思路就出现了:如果你从最后一牌开始逆推回来,每次翻转一牌,最后就会得到那13排好序的黑桃牌,这个过程中,每次翻牌时所对应的数字,就是逆推出来的牌的点数。 从观众的角度来看,他们不知道魔术师的牌是如何排好的,也不知道他的翻牌操作是怎么与牌面对应的,所以被魔术师快速翻牌、报数的过程所迷惑,感觉他非常神奇。但其实这只是一种巧妙的数学方法精心表演而成的魔术而已。 总之,这个魔术需要魔术师在无数次的练习与表演后才能熟练使用的方法和技巧,并且在表演时需要非常注意细节,以让观众无从下手,自然而然的被结果所迷惑。 ### 回答3: 魔术师猜牌术是一种极具挑战性的魔术表演,需要魔术师的高超技巧和对牌面的精准记忆。 魔术师预先将黑桃牌排好顺序,迭在一起,然后在不看牌的情况下数数猜牌。对于一般观众而言,这是一种近乎不可思议的表演,但其实这背后有着科学和技术的支持。 首先,这种表演需要魔术师有对牌面的精准记忆。牌面共有52,然而魔术师只使用13黑桃牌,应对的难题是如何能够在不犯错的情况下,准确地记得每一牌的位置和面值。这就需要魔术师在学习这种表演前进行长时间的训练和练习,将牌面深深地印在脑海之中。 其次,魔术师在表演时,利用了简单的数学知识,帮助自己准确地猜出每牌。魔术师将最上面的那牌数为1,每数到一牌时,就需要将前面的数码加上这牌的点数(如:A为1,J为11,Q为12,K为13),这样数码就可以轻松地转换为每牌的点数。此外,魔术师对这些数码有着敏锐的感觉,可以通过自己的手感和节奏,从而准确地猜出每牌的面值。 总而言之,魔术师猜牌术是一种非常高超的魔术技巧,需要魔术师经过艰苦的训练和练习,才能够达到如此精准的表演水平。但其背后的科学和数学知识,却都是非常基础的,只有掌握了这些知识和技能,才能够在各种场合中大展魔术师的风采。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值