【经典趣味算法】常胜将军算法

本文介绍了一种名为常胜将军的算法,并将其应用于经典的取火柴游戏中,确保某一方(B)能够始终获胜。通过分析游戏规则和策略,详细解释了算法的工作原理,并提供了具体的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、常胜将军游戏规则

游戏规则: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;
}

四、运行结果

1

2


—— 2018-11-29 ——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值