2013-11-04 实验之取球游戏(递推思想,数学归纳思想,思维逻辑思想)
2013-11-04 17:36
387 查看
题目:
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7或者8个。
轮到某一方取球时不能弃权!
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
程序运行时,从标准输入获得数据,其格式如下:
先是一个球的最大个数
程序则输出最大个数下的A的赢球队列和输球队列时球的个数
思想:递推思想,数学归纳思想,首先手工计算前面小球时,A的输赢情况,组成赢球,输球队列,此时发现,对于任意的球的个数,只要在取完1,3,7,8中任意一个后,使对方落入输球队列就可,若都不能落入,则该球落入输球队列,否则将落入赢球队列。所以要计算依次从打大小计算1至n个球。
程序实现:
今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。
我们约定:
每个人从盒子中取出的球的数目必须是:1,3,7或者8个。
轮到某一方取球时不能弃权!
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
程序运行时,从标准输入获得数据,其格式如下:
先是一个球的最大个数
程序则输出最大个数下的A的赢球队列和输球队列时球的个数
思想:递推思想,数学归纳思想,首先手工计算前面小球时,A的输赢情况,组成赢球,输球队列,此时发现,对于任意的球的个数,只要在取完1,3,7,8中任意一个后,使对方落入输球队列就可,若都不能落入,则该球落入输球队列,否则将落入赢球队列。所以要计算依次从打大小计算1至n个球。
程序实现:
#include<stdio.h> #include<stdlib.h> #include<string.h> int seed[] = {1, 3, 7, 8}; int AWin[10000]; int ALose[10000]; int Is_the_win(int temp) { int i = 0; for(i = 0; i < sizeof(ALose)/sizeof(ALose[0]); i++) { if(ALose[i] == 0){ return 0; }else { if(ALose[i] == temp){ return 1; //win } } } } void put_win_array(int temp) { int i = 0; for(i = 0; i < sizeof(AWin)/sizeof(AWin[0]); i++) { if(AWin[i] == 0){ break; } } AWin[i] = temp; } void put_loser_array(int temp) { int i = 0; for(i = 0; i < sizeof(ALose)/sizeof(ALose[0]); i++) { if(ALose[i] == 0){ break; } } ALose[i] = temp; } void get_lose_win(int target) { int i = 0; int temp; for(i = 0; i < sizeof(seed)/sizeof(seed[0]); i++) { temp = target - seed[i]; if(temp > 0){ if(Is_the_win(temp)){ put_win_array(target); return; } } } put_loser_array(target); } int main(void) { ALose[0] = 1; AWin[0] = 2; int num; printf("Please input the max num next, we will give the win and lose array as follows.\n"); printf("Please input:"); scanf("%d", &num); int i; for(i = 3; i <= num; i++){ get_lose_win(i); } printf("\nWin Array as follows:\n"); for(i = 0; i < sizeof(AWin)/sizeof(AWin[0]); i++) { if(AWin[i] == 0){ break; } if(i%10 == 0){ printf("\n"); } printf("%-4d ", AWin[i]); } printf("\n"); printf("\nLose Array as follows:\n"); for(i = 0; i < sizeof(ALose)/sizeof(ALose[0]); i++) { if(ALose[i] == 0){ break; } if(i%10 == 0){ printf("\n"); } printf("%-4d ", ALose[i]); } printf("\n"); }
相关文章推荐
- 2013-11-07 实验之火柴游戏(递归思维逻辑,转化思维,查找最优解思维)
- 2013-11-09 实验之买不到的糖果数目(递推思维+思维逻辑题)
- 十大思想实验(思维风暴)
- 浅谈数学思维方法与计算机思想的关系
- SDUT OJ 周赛 找有毒的那杯水(思维逻辑 + 分治思想 )
- 数学思维游戏两则:Gabriel喇叭、世界末日论
- 2013-11-03 实验之最大公共子串(思维逻辑题)
- 斐波那契,DP,递归,递推,数学归纳
- [BZOJbegin][NOIP十连测第七场]约瑟夫游戏(递推|数学相关|递归)
- 51NOD - 1381 1381 硬币游戏【思维+数学期望】
- 【51nod】---硬币游戏(思维&&数学)
- 第四届“图灵杯”NEUQ-ACM程序设计竞赛 A: 谷神的游戏【思维+组合数学】
- HDU 4611 Balls Rearrangement (数学-思维逻辑题)
- ZZULIOJ 1905 小火山的跳子游戏(数学思维题)
- 2013-10-30 实验之古堡算式(思维逻辑题)
- HDU 4611 Balls Rearrangement (数学-思维逻辑题)
- 数学思想 —— 对称性思维
- 问题 : 谷神的赌博游戏(数学思维+排列组合)
- SOJ【栈】射击游戏(递推思想)
- 游戏数学中的数学思想