一、常胜将军游戏规则
游戏规则:AB两人玩取火柴的游戏,共有21根火柴。每人每次最多取4根,最少取一根。取到最后一根火柴的玩家算输。保证某一玩家每次都赢!
二、算法分析
如果每次都想让其中一个玩家赢(此处假设为B),那么只要控制最后剩余一根火柴给另一个玩家,就能保证B获胜;根据取火柴的总数可以知道只要保证每次都会取5根火柴,最后一定会剩余一根火柴,只要控制让最后一根火柴被A取走即可!所以如果A先取n根火柴,B只要每次只要取5-n根火柴,最后一根火柴肯定会被A取走;如果B先取火柴,则只要在前几次在5-n的取数中,多取5个就可以了!(常胜将军算法是取火柴游戏算法的一个特例)
三、代码实现
/****************/
/* name: csjj.c */
/* auth: tianmt */
/* desc: B win */
/****************/
#include <stdio.h>
int csjj(){
int A = 0, B = 0;
int remain = 21;
while(1){
// A取
printf("please input number: >");
scanf("%d", &A);
if(A<1 || A>4 || A>remain){
printf("illegal number!\n");
setbuf(stdin, NULL); // 防止输入非法字符导致死循环
continue;
}
remain -= A;
printf("remain number: %d\n", remain);
if(0 == remain){
printf("B win!\n");
break;
}else{
// B取
B = 5 - A;
remain -= B;
printf("B take: %d\nremain: %d\n", B, remain);
if(0 == remain){
printf("A win!\n");
break;
}
}
}
}
int main(void){
csjj();
return 0;
}
四、运行结果
—— 2018-11-29 ——