某大公司的一道面试逻辑题

来源:互联网 发布:javascript设置cookie 编辑:程序博客网 时间:2024/05/16 00:51

去面某大公司被问了一道题,现在有N(N是偶数且要符合某个规则)个球,然后有2个人A和B,他们每次能摸的球的数目呢是2 , 4, 8个,现在问如果A先摸球,如何让A100%获胜.
当时时间太紧,并且紧张没能想出来,今天重新整理思路把这题给做了出来
这道题呢要把球分解一下,分解成p个4球 和 q个2球的组合,由于N是偶数所以必定能分解,且分解后q最多为1(优先分配4球)
为何要这样分解呢,我们可以考虑一下如何才能获胜,要获胜那么也就是必定要让你摸完倒数第二次之后,对方不可能一次摸完余下的球
对方在什么情况不可能摸完余下所有的球呢?
当A摸完之后,可能有如下情况
1:剩余6个球 = p+q(此时B只能摸2个,不允许一次摸6个这种情况存在,所以A摸4个就可以获胜)
2:剩余10个球 = 2p + q(此时B若摸2或者8个,则A摸8个或者4个获得胜利;若B摸4个,剩余剩余6个,则A输)
3:剩余12个球 = 3p(B摸2个,则跳到情况2,这里要注意,跳到2之后就变成A摸球了,所以A可以摸4个让B输,则B输;摸4和8个仍就是B输;)

发现只要A摸完后剩余的球带有p+q组合的即6的组合的,B就无法获胜,现在我的目的就简单了,我只需要每次总是让摸完后剩余的球是6的倍数就可以了
到这里我们知道了 球的总数不能为6的倍数,否则A就没有办法100%获胜

void Pickball_game(int sum){using namespace std;if(sum < 2 || sum %2 != 0 || sum %6 == 0){cout << "球的个数不符合规则" << endl;return;}srand(int(time(0)));int b[] = {2,4,8};//每次取球的个数//A第一个摸球,第一个摸球就能掌控全局cout << "当前一共有" << sum <<"个球,游戏开始" << endl;while(sum){int pick =sum -  sum/6*6 ;sum -= pick;cout << "A摸了"<< pick << "个球";if(sum == 0){cout << ",A获得了胜利" << endl;return;}int t = rand()%3;while(sum < b[t]) t = rand()%3;sum -= b[t];cout << ",B摸了"<< b[t] << "个球";cout << ",还剩" << sum << "个球" << endl;}}





原创粉丝点击