社区
数据结构与算法
帖子详情
七根火柴题
willyhan
2002-01-25 11:17:44
加精
题:七根火柴,甲乙两人每次抽取一到两根,最后抽取的人获胜。如果甲先抽,获胜的所有方案列印出来。
今天的一道考试题,几年没摸数据结构了,没做出来,好是沮丧!
...全文
412
12
打赏
收藏
七根火柴题
题:七根火柴,甲乙两人每次抽取一到两根,最后抽取的人获胜。如果甲先抽,获胜的所有方案列印出来。 今天的一道考试题,几年没摸数据结构了,没做出来,好是沮丧!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
willyhan
2002-01-28
打赏
举报
回复
感谢starfish,同时也敬佩无比!
我拿到这种题怎么也找不到思路,能否指教我,如何构思这类题?感激不尽!
cxjddd
2002-01-27
打赏
举报
回复
先下比赢。
starfish
2002-01-27
打赏
举报
回复
#include <iostream.h>
const int MAX_MATCH_COUNT = 100;
bool FirstWin[MAX_MATCH_COUNT + 1]; // FirstWin[i]=true 表示有i根火柴的时候先取者必胜,
// FirstWin[i]=false表示有i根火柴的时候先取者必败
int match_count, max_fetch; // match_count 火柴数目, max_fetch 每次最多可取的火柴的数目
int strategy[MAX_MATCH_COUNT]; // 用来记录取火柴的策略
int min(int a, int b) {
return (a < b ? a : b);
}
// 计算在哪些情况下先取者必胜或必败
void CalFirstWin()
{
FirstWin[0] = false;
for (int i = 1; i <= match_count; i++) {
FirstWin[i] = false;
for (int j = 1; j <= min(max_fetch, i); j++) {
if (FirstWin[i - j] == false) {
FirstWin[i] = true;
break;
}
}
}
}
// 打印必胜策略
void PrintStrategy(int n, bool A_Fetch, int step)
{
if (n == 0) {
for (int i = 0; i < step; i++) {
cout << strategy[i] << " ";
}
cout << endl;
return;
}
if (A_Fetch) { // 轮到A取
for (int i = 1; i <= min(max_fetch, n); i++) {
if (FirstWin[n - i] == false) {
strategy[step] = i;
PrintStrategy(n - i, false, step + 1);
return;
}
}
} else { // 轮到B取
for (int i = 1; i <= min(max_fetch, n); i++) {
// 对B的每一种取法都给出必胜策略
strategy[step] = i;
PrintStrategy(n - i, true, step + 1);
}
}
}
void main()
{
match_count = 7;
max_fetch = 2;
CalFirstWin();
if (FirstWin[match_count] == false) {
cout << "A can not win!" << endl;
} else {
PrintStrategy(match_count, true, 0);
}
}
journay
2002-01-27
打赏
举报
回复
倒推吧!
leopro
2002-01-26
打赏
举报
回复
只要使剩下的是三的倍数就行了
对于N根火柴情况
N mod 3 =0 则先抽的必输
否则先抽必胜!
congling
2002-01-25
打赏
举报
回复
如果要写出方案通过Next和next的组合就可以了,就是找0值.
A:7->6-->5->3-->2-->0
-->1-->0
-->4->3-->2-->0
-->1-->0
congling
2002-01-25
打赏
举报
回复
取火柴问题就是著名的Nim问题,当然你这个问题比较简单,不用Nim解决也可以
如果想了解,察看:
http://www.csdn.net/expert/topic/424/424009.shtm
Next(0)不存在,|0|=0
Next(1)={0},next(1)={0},|1|=1
Next(2)={0,1};next(2)={1,0} |2|=2
Next(3)={1,2};next(3)={1,2} |3|=0
Next(4)={2,3};next(4)={0,2} |4|=1
Next(5)={4,3};next(5)={1,0} |5|=2
Next(6)={5,4};next(6)={1,2} |6|=0
Next(7)={6,5};next(7)={0,2} |7|=1
因此7根火柴必胜。
可以证明,
|3k|=0
|3k+1|=1
|3k+2|=2
karma
2002-01-25
打赏
举报
回复
1fei(白天):
真的么?如果只有3根火柴呢?:-)
williexu
2002-01-25
打赏
举报
回复
提示思路:
从后往前算,最后剩下1/2根被甲抽到,依次往前加,乙抽、甲抽、乙抽、甲抽...,每次1/2根,如果加完后共是7根且为甲所加,则输出。
算法与货郎担类似。
willyhan
2002-01-25
打赏
举报
回复
最好请写出程序算法
1fei
2002-01-25
打赏
举报
回复
不管几根火柴都是先抽的胜
karma
2002-01-25
打赏
举报
回复
甲先抽1, 接下来,如果乙抽1,甲就抽2, 乙抽2,甲就抽1, .....
巧移
火柴
棒练习
题
(二年级)-二年级数学小棒
题
.docx
- 通过移动一根
火柴
棒,将等式变为7+1-1=7 或 1-1+7=7,保持等式两边相等。 10. 15根
火柴
棒构成5个正方形,去掉3根变为3个正方形: - 关键在于如何减少正方形的数量而不破坏其他正方形,可能需要将一个大正方形...
火柴
棒游戏练习
题
.pdf
7. 三根
火柴
棒构成90°角的数量: 最多可以摆出3个90°角,将三根
火柴
互相垂直放置。 8. 24根
火柴
棒变成两个正方形: 移动4根
火柴
,将原来的回字形的中心交叉点去掉,形成两个相连的正方形。 9. 用特定数量
火柴
...
巧移
火柴
棒练习
题
集(二年级)~二年级数学小棒
题
.doc
10. 15根
火柴
棒形成5个正方形,拿走3根变成3个正方形: - 关键在于不留下多余部分,确保所有
火柴
都用在正方形上。 11. 移动一根
火柴
得到四位数中的最大值和最小值: - 策略:分析数字结构,了解如何通过移动一根...
巧移
火柴
棒游戏训练方法及训练
题
库.docx
例如,用12根
火柴
棒组成3个正方形,之后需要玩家移动其中三根
火柴
棒,形成7个正方形。这类问
题
检验玩家在视觉和空间上解决问
题
的能力。 #### 第六阶段:图形变换 第六阶段将玩家的注意力转向图形的变换。例如,...
巧移
火柴
棒答案-
火柴
数学
题
.doc
* 思路点睛:同理拿走 5 根,还剩 7 根
火柴
,7÷3=2……1,必定有两根
火柴
要充当三角形的公共边,也就是说摆出的 3 个一样三角形必定全都连在一起。 数学思考
火柴
数学游戏需要 player 具有很强的逻辑思维和数学...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章