谁拿最后一根火柴 程序设计 大家帮帮忙!
来源:百度知道 编辑:UC知道 时间:2024/06/16 12:41:03
[提示] 在计算机后走的情况下,要想使计算机成为“常胜将军”,必须找出取的关键。根据本题的要求加以总结出,后走一方取子的数量与对方刚才一步取子的数量之和等于某个数,就可以保证最后一个子是留给先取子的那个人的。 据此分析进行算法设计就是很简单的工作,编程实现也十分容易。
计算机编程,我想要一个完整的程序。最好是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;