常胜将军
一、问题描述
游戏规则:AB两人玩取火柴的游戏,共有21根火柴。每人每次最多取4根,最少取一根。取到最后一根火柴的玩家算输。保证某一玩家每次都赢!
二、算法分析
如果每次都想让其中一个玩家赢(此处假设为B),那么只要控制最后剩余一根火柴给另一个玩家,就能保证B获胜;根据取火柴的总数可以知道只要保证每次都会取5根火柴,最后一定会剩余一根火柴,只要控制让最后一根火柴被A取走即可!所以如果A先取n根火柴,B只要每次只要取5-n根火柴,最后一根火柴肯定会被A取走;如果B先取火柴,则只要在前几次在5-n的取数中,多取5个就可以了!(常胜将军算法是取火柴游戏算法的一个特例)
三、代码实现
若使计算机每次获胜,那么该用户先取火柴(n),计算机每次取5-n;
import java.util.Scanner;
public class Gilded {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int last = 21;//剩余火柴数
System.out.println("常胜将军小游戏");
while (true) { //死循环保证游戏能持续进行,直到决出胜负
System.out.printf("目前火柴剩余%d根\n",last);
System.out.print("用户取火柴的数量为:");
//用户取火柴
int user = sc.nextInt();
if ((user < 1)||(user > 4)||(user > last) ) {
System.out.println("您的输入有误,请重试");
continue;
}
last = last - user;
if (last == 0) {
System.out.println("用户取了最后一根火柴,计算机获胜");
break;
}else {
//计算机取火柴的数量
int com = 5 - user;
System.out.printf("计算机取火柴的数量为:%d\n",com);
//剩余火柴数量
last = last - com;
if (last == 0) {
System.out.println("计算机取了最后一根火柴,用户获胜");
break;
}
}
}
}
}
四、演示截图