常胜将军算法

甲和乙两人玩抽取火柴的游戏,共有21根火柴。每人每次最多取4根,最少取1根火柴。如果某个人取到最后一根火柴则输了.甲让乙先抽取,结果每次都是甲赢.这是为什么?

算法分析:甲要每次都赢,那么每次甲只给乙剩1根火柴,因为此时乙至少取一根火柴,这样才能保证甲赢。由于乙先抽取,因此只要保证甲抽取的数量和乙抽取的数量之和为5即可。

package suanfa;

import java.util.Scanner;

public class Example_3 {
	
	static int computer,user,last;
	
	public static void main(String[] args) {
		int num;
		System.out.println("请先输入火柴的总数量 ");
		Scanner input = new Scanner(System.in);
		num = input.nextInt();
		System.out.printf("火柴总数量 %d根",num);
		last = num;
		jiangjun();
		
	}
	
	public static void jiangjun(){
		while(true){
			System.out.printf("----------目前还有火柴 %d 根 ------------\n",last);
			System.out.println("用户取火柴数量");
			Scanner input = new Scanner(System.in);
			user = input.nextInt();
			if(user <1 || user>4 ||user>last){
				System.out.println("你违规了");
				continue;
			}
			last = last - user;
			if(last == 0){
				System.out.println("用户取得最后一根火柴,计算机赢了");
				break;
			}else{
				computer = 5-user;
				last = last - computer;
				System.out.printf("计算机取火柴数量%d根 \n",computer);
				if(last == 0){
					System.out.println("计算机取得最后一根火柴,用户赢了");
					break;
				}
			}
		}
	}
	
}

结果

请先输入火柴的总数量
21
火柴总数量 21根----------目前还有火柴 21 根 ------------
用户取火柴数量
4
计算机取火柴数量1根
----------目前还有火柴 16 根 ------------
用户取火柴数量
3
计算机取火柴数量2根
----------目前还有火柴 11 根 ------------
用户取火柴数量
2
计算机取火柴数量3根
----------目前还有火柴 6 根 ------------
用户取火柴数量
1
计算机取火柴数量4根
----------目前还有火柴 1 根 ------------
用户取火柴数量
1
用户取得最后一根火柴,计算机赢了

你可能感兴趣的:(算法)