【趣味编程】常胜将军

来源:互联网 发布:上海网络机柜回收 编辑:程序博客网 时间:2024/05/17 23:37

常胜将军

一、问题描述

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

四、演示截图






原创粉丝点击