有趣的问题.......(有难度的).......

wuasi2008 2002-05-15 04:26:41
有3堆东西,数量分别是7,5,3。有2 个人玩游戏,,只能在一堆里取,数量不限
但只能从一堆里取。,,谁取完最后一个就是算赢。。。。。。
问你怎么写一个算法。。。才使你一定能胜。。
假设是你先拿。。。。。。。。。。。。。。
大家想想。。。。。。如果能用c语言写一个算法更好。。。。。。
...全文
17 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dirotac 2002-05-18
  • 打赏
  • 举报
回复
gz
crazyingmouse 2002-05-18
  • 打赏
  • 举报
回复
因为你自己想拿最后一个,那你没次取完之后,总要把平衡状态丢给别人用。然后,因为任意一种平衡状态提取一次后,总变成非平衡状态,任何非平衡状态,总有办法取成平衡状态。那么,你只要一开始的时候,是从非平衡开始,然后先拿的人就等着收钱拉。
mathe 2002-05-16
  • 打赏
  • 举报
回复
的的确确就这么简单, IT_worker(IT工人) 没有错啦
wuasi2008 2002-05-16
  • 打赏
  • 举报
回复
我知道了。。。。
原来那个东西是位异或。。。。
昨天晚上我找到这个东西了/。。。。。。
我真菜。。
我还想问大家一个问题。。。。。
你们第一次拿到这个问题是怎么考虑的。。。。。
能不能说一下思路/。。。。
starfish 2002-05-15
  • 打赏
  • 举报
回复
hoho, mathe is right. This is a very classic problem in game-play field.
wuasi2008 2002-05-15
  • 打赏
  • 举报
回复
不会象你说得那么简单吧....
我回去试试............
IT_worker 2002-05-15
  • 打赏
  • 举报
回复

假如有m堆石头每一堆的个数是n1,n2,……nm个那么当n1^n2^……^nm等于零的时候先动手的人必输。
证明:
如果n1^n2^……^nm==0那么先动手的人无论怎么拿都将造成他拿之后的n1^n2^……^nm!=0
如果n1^n2^……^nm!=0那么先动手的人总有一种拿法使得他拿之后的n1^n2^……^nm==0
于是:一方总面对n1^n2^……^nm==0。而另一方总面对n1^n2^……^nm!=0。
当n1==n2==……==nm==0的时候游戏结束,面对他的人输了! 证明完毕。

因为 7^5^3=1 那么先拿的人必赢。有三种拿法分别是:6,5,3 7,4,3 7,5,2

如果要写函数的话可以这样写
bool next(int&a,int&b,int&c)
{
if( a^b^c == 0 )
return false;
if( a > b^c )
a = b^c;
else if( b > a^c )
b = a^c;
else
c = a^b;
return true;
}
void machine_play(int &a,int &b,int &c)
{
if( next(a,b,c) ){
cout<<"你要输了!!!"<<endl;
return;
}
cout<<"你狠!!!"<<endl;
if( a>0 ) a -= (rand()%a)+1;
else if( b>0 ) b -= (rand()%b)+1;
else c -= (rand()%c)+1;
}
mathe 2002-05-15
  • 打赏
  • 举报
回复
这时很经典的问题,太简单了,先手只要能够使余下各堆中剩余东东数目异或之和为0就可以了,比如上面情况,从任何一堆拿走一根就可以了。
还有更多类似的问题:

http://members.lycos.co.uk/huidu/club/bbssearch.php?utitle=石子

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧