您的位置:首页 > 其它

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个球。

程序实现:

#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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: