找回密码
 欢迎注册
楼主: 风云剑

[讨论] 一个老题,扑克博弈

[复制链接]
发表于 2008-7-2 10:40:17 | 显示全部楼层
看的比一头雾水还雾水 这就是C/C++的好处哦
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:42:00 | 显示全部楼层
原帖由 gxqcn 于 2008-7-2 10:36 发表 可否用文字具体叙述之后的出牌策略?
现在只有计算机使用的策略,不知道能否有简单的规律. 有一种方法,可以将程序所有结果为SUCC的状态输出来看看是否有规律。(可以只输出先手和后手牌的数目相等或先手比后手多一张牌两类)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:44:04 | 显示全部楼层
就是说,没有开局策略 只有具体的一个个局面的排列
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:45:27 | 显示全部楼层
原帖由 无心人 于 2008-7-2 10:40 发表 看的比一头雾水还雾水 这就是C/C++的好处哦
这个同语言关系不大,同使用的注释,代码风格,使用算法的复杂度,还有阅读者对语言的熟悉程度都有关系
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 10:52:34 | 显示全部楼层
呵呵 确实 至今我对C/C++都只能说入门 我起步的语言是Pascal 在尝试看懂C之前经历了三年 连函数都弄不懂 而那时已能明白汇编了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 11:04:55 | 显示全部楼层
我在学习C/C++之前也学过BASIC,FORTRAN,8086汇编,Pascal 不过现在其他都忘得差不多了,只有C/C++由于经常使用,越来越熟悉了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 11:14:40 | 显示全部楼层
C/C++的逻辑是 语法的字符简单,字符!! 贴近硬件,所以灵活多变 很佩服近40年的老语言还这么健壮
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-7-2 12:58:22 | 显示全部楼层
原帖由 mathe 于 2008-7-2 09:31 发表 有简单的方法吗?计算机说只要先手先出3,4,5或6都可以赢
程序不对吧,我把你的程序里50改成7,怎么还是先手必胜?明显是必败的啊。我写了个程序,直接递归搜索,结果50也是必败的,而且随着数字的增大,先手获胜的机会越来越小。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 13:00:55 | 显示全部楼层
感觉程序确实有些问题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-2 14:00:01 | 显示全部楼层
的确题目是先手负,忘记了每次产生下一个状态要交换两个人状态,所以产生状态顺序不再单调了,所以不能顺序产生,修改一下代码:
  1. #include <stdio.h>
  2. #define LIMIT (1<<24)
  3. int states[LIMIT];
  4. #define FAIL -1
  5. #define SUCC -2
  6. #define R 50
  7. void gen(int left);
  8. int get_state(int x){
  9. if(states[x]==0){
  10. gen(x);
  11. }
  12. return states[x];
  13. }
  14. void gen(int left){
  15. int first_u=left&((1<<12)-1);
  16. int second_u=left>>12;
  17. int cfirst,csecond;
  18. int i,sum;
  19. cfirst=csecond=0,sum=0;
  20. for(i=0;i<6;i++){
  21. int c1=(first_u>>(2*i))&3;
  22. int c2=(second_u>>(2*i))&3;
  23. cfirst+=c1;
  24. csecond+=c2;
  25. sum+=(c1+c2)*(i+1);
  26. }
  27. if(cfirst!=csecond&&cfirst-1!=csecond)
  28. return;
  29. sum=126-sum;
  30. if(sum>R){
  31. states[left]=FAIL;
  32. }else if(sum==R){
  33. states[left]=SUCC;
  34. }else{
  35. int s[6],j;
  36. for(i=0;i<6;i++){
  37. s[i]=(first_u>>(2*i))&3;
  38. }
  39. for(i=0;i<6;i++){
  40. int new_u=first_u;
  41. int reach;
  42. if(s[i]>0){
  43. new_u-=1<<(2*i);
  44. reach=second_u|(new_u<<12);
  45. if(get_state(reach)==SUCC)
  46. break;
  47. }
  48. }
  49. if(i<6){
  50. states[left]=FAIL;
  51. }else{
  52. states[left]=SUCC;
  53. }
  54. }
  55. }
  56. void output_states(int x);
  57. int next_state(int x)
  58. {
  59. int first_u=x&((1<<12)-1);
  60. int second_u=x>>12;
  61. int i,s[6];
  62. for(i=0;i<6;i++){
  63. s[i]=(first_u>>(2*i))&3;
  64. }
  65. int reach=-1;
  66. for(i=0;i<6;i++){
  67. int new_u=first_u;
  68. if(s[i]>0){
  69. new_u-=1<<(2*i);
  70. reach=second_u|(new_u<<12);
  71. if(states[reach]==SUCC){
  72. output_states(reach);
  73. }
  74. }
  75. }
  76. return reach;
  77. }
  78. void output_states(int x)
  79. {
  80. printf("State %06x:",x);
  81. if(states[x]==SUCC){
  82. printf("F");
  83. }else{
  84. printf("S");
  85. }
  86. printf("\n");
  87. }
  88. int main()
  89. {
  90. int i;
  91. gen(LIMIT-1);
  92. output_states(LIMIT-1);
  93. printf("next states:\n");
  94. next_state(LIMIT-1);
  95. return 0;
  96. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 21:29 , Processed in 0.026906 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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