谁拿最后一根火柴 程序设计 大家帮帮忙!

来源:百度知道 编辑:UC知道 时间:2024/06/16 12:41:03
现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”。

[提示] 在计算机后走的情况下,要想使计算机成为“常胜将军”,必须找出取的关键。根据本题的要求加以总结出,后走一方取子的数量与对方刚才一步取子的数量之和等于某个数,就可以保证最后一个子是留给先取子的那个人的。 据此分析进行算法设计就是很简单的工作,编程实现也十分容易。

计算机编程,我想要一个完整的程序。最好是java的!但是你要是别的我也没关系,主要是能看懂就行。答对了我再给你50分,真的不骗你,我现在有很多分!
不一定非要这个题目的,类似的也可以的,主要是想明白这个道理!
我主要是想问问下面这道题,原以为这两道题,差不多,但是现在看来还是相差很远的。

有3堆火柴,一堆3根,一堆5根,一堆7根,两人轮流拿,规定一次只能从一堆里拿,根数不限。
问:如何设计算法才能使你拿不到最后一根?能用程序写出来吗?拜托了。我一定加分的。

三楼的同志,你写的代码,我执行了,但是不正确啊,我要是总输入2的话,他就一直执行下去,没有结束。你看你能不能改改,我的悬赏已经加了

这个道理和编程无关,每人最多取4根,
1+4=5
21=5*4+1
也就是说,只要保证每轮两方之和是5,那么4轮后取走20根,最后先取的人必定取最后一根。

第二题:需要用递推的方式,计算所有必胜必输的状态,然后保证每次取火柴都让对方到达必输状态。
所谓必输就是只剩最后一根,或者无论怎么取后的结果都是必胜。
所谓必胜,就是可以对方到达必输状态的情况。

程序如下:
import java.io.*;

public class Picker {
// 火柴堆的输赢状况
private final static int EMPTY=0; // 这种排列不可能出现,如108
private final static int UNKNOWN=1; // 尚未计算出
private final static int WIN=2; //必胜
private final static int LOSE=3; //必输(如果对方够聪明)

// 用数组,保存每种火柴堆排列的输赢状态,下标为排列,如357, 111, 001, 100等等
private int[] status;

public Picker() {
// 初始化状态数组,排除所有不可能出现的情况
status = new int[358]; // 0 - 357
int i,j,k;
for (i=0; i<=3; i++) {
for (j=0; j<=5; j++) {
for (k=0; k<=7; k++) {
status[i*100+j*10+k] = UNKNOWN;
}
}
}

// 已知 100, 010, 001必输
status[1]=LOSE;
status[10]=LOSE;

谁拿最后一根火柴 程序设计 大家帮帮忙! 最后一根火柴全文 最后一根火柴 有100根火柴,两个人轮流拿,一人一次最多拿10根,谁拿到最后一根谁赢. 桌上放着2007根火柴,甲乙两人轮流拿每次每人只能拿1根2根3根。谁拿到最后一根算胜,现在甲先拿, 一堆火柴50根甲,乙两人轮流去拿谁拿到最后一根谁胜每人每次可以拿1至4根不许不拿乙让甲.先拿谁一定能取胜 《最后一根火柴》这篇文章的联想 180根火柴,俩人轮流玩取火柴游戏,规定每人每次取1-7根,谁取到最后一根为输.怎样拿,才能取胜? 61根火柴,2人轮流拿.规定每人每次至少拿走1根,最多拿走3根,直到拿完为止,谁先拿到最后一根谁胜. 2004根火柴甲乙从中拿1.2.3根火柴,每次必须拿,甲先拿,谁最后拿完谁获胜,甲和乙谁获胜