鱼C论坛

 找回密码
 立即注册
查看: 4861|回复: 11

[争议讨论] 算法每日一题(一)

[复制链接]
发表于 2011-7-4 19:48:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

问题:现在有21根火柴,两个人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”。


每次问题,会在当天发布解题思路和相应程序。发题时间为上午(本次除外),解答时间为晚上8点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-4 21:27:40 | 显示全部楼层
21 = 4 * 5 + 1,
所以只要每次取的总和为5根,最后一根必定是玩家取到。
  1. /*
  2. **        问题:现在有21根火柴,两个人轮流取,
  3. **        每人每次可以取走1至4根,不可多取,也不能不取,
  4. **        谁取最后一根火柴谁输。请编写一个程序进行人机对弈,
  5. **        要求人先取,计算机后取;计算机一方为“常胜将军”。
  6. **        By 小锅
  7. **        7/4/11
  8. */

  9. #include <stdio.h>

  10. int main()
  11. {
  12.         int StickNum = 21;
  13.         int i;
  14.        
  15.         printf( "Game Start!\n" );
  16.         while( StickNum > 0 )
  17.         {
  18.                 do{
  19.                         printf( "How many sticks do you want to take (1 ~ %d) : ", StickNum > 4 ? 4 : StickNum );
  20.                         scanf( "%d", &i );
  21.                 }while( i < 1 || i > 4 || i > StickNum );
  22.                 if( StickNum - i > 0 )
  23.                         printf( "%d stick left in the pile.\n", StickNum - 1 );
  24.                 if( StickNum - i <= 0 )
  25.                 {
  26.                         printf( "You have taken the last stick!\n" );
  27.                         printf( "You Lose!\nGanme Over!\n" );
  28.                         break;
  29.                 }
  30.                 else
  31.                 {
  32.                         printf( "Computer take %d stick(s).\n", 5 - i );
  33.                         StickNum -= 5;
  34.                         printf( "%d stick left in the pile.\n", StickNum );
  35.                 }
  36.                        
  37.         }
  38.         return 0;
  39. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +2 收起 理由
LNH_Sniper + 1 + 2 很不错,继续努力。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-5 01:31:50 | 显示全部楼层
正如chao_price所说,本题的核心就是:每轮抽取,人与计算机抽取之和为5,即可实现计算机的长胜不败


复制代码
  1. #include "stdio.h"

  2. int main()
  3. {
  4. int computer, people, spare;
  5. spare = 21;
  6. printf("Game Begin:\n\n");

  7. while(1)
  8. {
  9. printf("-----------&Auml;&iquest;&Ccedil;°&raquo;&sup1;&Oacute;&ETH;&raquo;&eth;&sup2;&ntilde; %d &cedil;ù------------\n",spare);
  10. printf(" People: ");
  11. scanf("%d",&people);
  12. if( people < 1 || people > 4 || people > spare )
  13. {
  14. printf("You Take A Wrong Number!!\n\n");
  15. continue;
  16. }
  17. spare = spare - people;
  18. if( spare == 0 )
  19. {
  20. printf("\nComputer Win!!\n Game Over!!\n");
  21. break;
  22. }
  23. computer = 5 - people;
  24. spare = spare - computer;
  25. printf("Computer :%d \n",computer);
  26. if( spare == 0 )
  27. {
  28. printf("\n People Win!!\n Game Over!!\n");
  29. break;
  30. }
  31. }

  32. return 0;
  33. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-6 10:58:20 | 显示全部楼层
这就是谁先取谁输啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-19 10:53:19 | 显示全部楼层
厉害啊!知道答案了觉得也没那么复杂了{:1_1:},不过自己开始的时候还是不知道怎么下手呢!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-20 19:59:13 | 显示全部楼层
这是博弈问题,n根火柴,一次最多取m根的话,只要n%(m+1)!=0,就是先手必胜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-21 13:43:41 | 显示全部楼层
这是博弈问题,n根火柴,一次最多取m根的话,只要n%(m+1)!=0,就是先手必胜~
我赞成这个~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:00:30 | 显示全部楼层
:lol好贴 学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2018-2-5 11:10:48 | 显示全部楼层
#用Python写的(*^__^*) 嘻嘻……
def matchstick(number = 21):
                import random
                while( number > 0 ):
                                human = input('请输入1~4根火柴的数量\n您的选择是:')
                                while(not human.isdigit()) or ((human == '0' ) or (human > '4')):
                                                human = input('请重新输入1~4根火柴的数量\n您的选择是:')
                                human = int(human)
                                number -= human
                                if(number <= 0):
                                                print('\n此时火柴的数量为:%d\n' % number)
                                                break
                                if(number > 4):
                                                robot = random.randint(1,4)
                                elif(number < 4):
                                                robot = random.randint(1,3)
                                elif(number < 3):
                                                robot = random.randint(1,2)
                                elif(number == 1):
                                                robot = 1
                                print('\'常胜将军\'选择的数量是:%d' % robot)
                                number -= robot
                                print('\n此时火柴的数量为:%d\n' % number)
                if(number - robot <= 0):
                                human = input('请输入大侠英名:')
                                print('恭喜\'%s\'您获得了胜利!' % human)
                if(number - human <= 0):
                                print('恭喜\'常胜将军\'获得了胜利!' )

matchstick()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 11:12:16 | 显示全部楼层
z1446773686 发表于 2018-2-5 11:10
#用Python写的(*^__^*) 嘻嘻……
def matchstick(number = 21):
                import random

可是我自己写的哦(*^__^*) 嘻嘻……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 11:15:40 | 显示全部楼层
z1446773686 发表于 2018-2-5 11:10
#用Python写的(*^__^*) 嘻嘻……
def matchstick(number = 21):
                import random

还是有不足之处,恩慢慢改进不捉急
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 12:20:04 | 显示全部楼层
#改进后的
def matchstick(number = 21):
                import random
                print('\n此时火柴的数量为:%d\n' % number)
                while( number > 0 ):
                                human = input('请输入1~4根火柴的数量\n您的选择是:')
                                while(not human.isdigit()) or ((human == '0' ) or (human > '4')):
                                                human = input('请重新输入1~4根火柴的数量\n您的选择是:')
                                human = int(human)
                                number -= human
                                print('此时火柴的数量为:%d\n' % number)
                                if(number <= 0):
                                                print('\n此时火柴的数量为:%d\n' % number)
                                                print('恭喜\'常胜将军\'获得了胜利!' )
                                else:
                                                if(number == 1):
                                                                robot = 1
                                                elif(number < 3):
                                                                robot = random.randint(1,2)
                                                elif(number < 4):
                                                                robot = random.randint(1,3)
                                                elif(number > 4):
                                                                robot = random.randint(1,4)
                                                print('\'常胜将军\'选择的数量是:%d' % robot)
                                                number -= robot
                                                print('\n此时火柴的数量为:%d\n' % number)
                                                if(number <= 0):
                                                                human = input('请输入大侠英名:')
                                                               
                                                                print('恭喜\'%s\'您获得了胜利!' % human)
                                
matchstick()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 03:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表