找回密码
 欢迎注册
楼主: 小铃铛

[讨论] 。。棋子游戏

[复制链接]
 楼主| 发表于 2017-3-3 20:56:39 | 显示全部楼层
本帖最后由 小铃铛 于 2017-3-3 20:59 编辑
mathe 发表于 2017-3-3 20:39
25=>18,6, 你至少应该先看一下别人的结论。过程即使看不懂,总可以试验一下结论吧


不明白你的意思,你认为25不是奇异数? 取成18+6是活的还?,后手可以取成18+2+2

25是先手必输。

我的意思是这个奇异数的判断很简单,没有原帖上分析的那么复杂,有通项公式可以求得
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-3 21:01:31 | 显示全部楼层
14+2+2+2
链接78#中结论
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-3-4 22:42:37 | 显示全部楼层
mathe 发表于 2017-3-3 20:39
25=>18,6, 你至少应该先看一下别人的结论。过程即使看不懂,总可以试验一下结论吧

你怎么知道我没看?
这个数列应该是1,4,9,12,20,25....

验证一下看看,你25=>18,6  我17+6
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-5 08:28:39 | 显示全部楼层
你自己玩吧
重新从csdn找到以前编译的代码,可以在windows命令行运行。
比如输入
cnext.exe 17 6
输出
17=>1+14
17=>2+13
17=>7+8
6=>5
也就是说接下去有四种选择方案可以赢,比如将17变成1和14或6变成5等

cnext.rar

5.98 KB, 下载次数: 1, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-5 08:40:24 | 显示全部楼层
从网页中搜索了源代码,不知道是否能够使用

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6. #define MAX 1000
  7. int s[MAX];
  8. //create state array if the user could remove all chesses
  9. //Given a list of number n1,n2,...,nh, the user wins iff
  10. // s[n1]^s[n2]^...^s[nh]==0
  11. //if users could remove the last chess
  12. void init()
  13. {
  14.         int st[MAX],i,j;
  15.         s[0]=0;s[1]=1,s[2]=2;
  16.         for(i=3;i<MAX;i++){
  17.                 for(j=0;j<MAX;j++)st[j]=0;
  18.                 st[s[i-1]]=1,st[s[i-2]]=1;
  19.                 for(j=1;j<=(i-1)/2;j++){
  20.                         int k=i-1-j;
  21.                         st[s[j]^s[k]]=1;
  22.                         k=i-2-j;
  23.                         st[s[j]^s[k]]=1;
  24.                 }
  25.                 for(j=0;j<MAX;j++)if(st[j]==0)break;
  26.                 s[i]=j;
  27.         }
  28. }
  29. int odd(int x){return (x&1)!=0;}
  30. int even(int x){return (x&1)==0;}
  31. //Function to test whether it is a win state if the last chess should not be removed
  32. //return 1 for win state and 0 for lost state
  33. //It is almost same as the case when last chess could be removed except for
  34. // some special cases related to number 1,4,5,9,12,17,20,25
  35. int test_state(const vector<int>& a)
  36. {
  37.         int s1,s4,s5,s9,s12,s17,s20,s25;
  38.         int i,r,so=0;
  39.         s1=s4=s5=s9=s12=s17=s20=s25=0;
  40.         for(r=0,i=0;i<a.size();i++){
  41.                 switch(a[i]){
  42.                         case 1:s1++;break;
  43.                         case 4:s4++;break;
  44.                         case 5:s5++;break;
  45.                         case 9:s9++;break;
  46.                         case 12:s12++;break;
  47.                         case 17:s17++;break;
  48.                         case 20:s20++;break;
  49.                         case 25:s25++;break;
  50.                         default:so++;break;
  51.                 }
  52.                 r^=s[a[i]];
  53.         }
  54.         if(odd(s9)&&even(s4+s1)&&so+s5+s12+s17+s20+s25==0||
  55.                         s12==1&&even(s1+s4)&&so+s5+s9+s17+s20+s25==0||
  56.                         odd(s5)&&odd(s1+s4)&&so+s9+s12+s17+s20+s25==0||
  57.                         even(s5)&&so+s9+s12+s17+s20+s25==0||
  58.                         even(s9+s12+s17)&&so+s5+s25==0||
  59.                         even(s9+s12+s17)&&odd(s1+s4+s20)&&s25==1&&so+s5==0||
  60.                         odd(s1+s4)&&odd(s9)&&s25==1&&so+s5+s12+s17+s20==0){
  61.                 r=!r;
  62.         }
  63.         return r!=0;
  64. }
  65. //read input number lists
  66. //user should input
  67. //programname n1 n2 n2 ... nh
  68. void readArg(int argc, char *argv[], vector<int>& input)
  69. {
  70.         int i;
  71.         input.clear();
  72.         for(i=1;i<argc;i++){
  73.                 int u=atoi(argv[i]);
  74.                 if(u<=0||u>=MAX){
  75.                         fprintf(stderr,"input %d not in range [1,%d]\n",u,MAX-1);
  76.                         exit(-1);
  77.                 }
  78.                 input.push_back(u);
  79.         }
  80.         sort(input.begin(),input.end());
  81. }
  82. //test the case that the offset'th chess of line index is removed
  83. // If it result in a lost state, output it
  84. void tryremoveone(const vector<int> input, int index, int offset)
  85. {
  86.         vector<int> outv;
  87.         int i;
  88.         for(i=0;i<index;i++)outv.push_back(input[i]);
  89.         if(offset==0){
  90.                 if(input[index]>1)outv.push_back(input[index]-1);
  91.         }else{
  92.                 outv.push_back(offset);
  93.                 if(offset<input[index]-1)outv.push_back(input[index]-1-offset);
  94.         }
  95.         for(i=index+1;i<input.size();i++)outv.push_back(input[i]);
  96.         if(test_state(outv)==0){
  97.                 int left1=offset,left2=input[index]-1-offset;
  98.                 if(left1==0&&left2==0)
  99.                         printf("Possible Move: Remove 1\n");
  100.                 else if(left1==0){
  101.                         printf("Possible Move: %d => %d\n",input[index],left2);
  102.                 }else if(left2==0){
  103.                         printf("Possible Move: %d => %d\n", input[index],left1);
  104.                 }else{
  105.                         printf("Possible Move: %d => %d,%d\n", input[index],left1,left2);
  106.                 }
  107.         }
  108. }
  109. //test the case that the offset'th and (offset+1)'th chesses of line index are removed
  110. // If it result in a lost state, output it
  111. void tryremovetwo(const vector<int> input, int index, int offset)
  112. {
  113.         vector<int> outv;
  114.         int i;
  115.         if(input[index]<2)return;
  116.         for(i=0;i<index;i++)outv.push_back(input[i]);
  117.         if(offset==0){
  118.                 if(input[index]>2)outv.push_back(input[index]-2);
  119.         }else{
  120.                 outv.push_back(offset);
  121.                 if(offset<input[index]-2)outv.push_back(input[index]-2-offset);
  122.         }
  123.         for(i=index+1;i<input.size();i++)outv.push_back(input[i]);
  124.         if(test_state(outv)==0){
  125.                 int left1=offset,left2=input[index]-2-offset;
  126.                 if(left1==0&&left2==0)
  127.                         printf("Possible Move: Remove 2\n");
  128.                 else if(left1==0){
  129.                         printf("Possible Move: %d => %d\n",input[index],left2);
  130.                 }else if(left2==0){
  131.                         printf("Possible Move: %d => %d\n", input[index],left1);
  132.                 }else{
  133.                         printf("Possible Move: %d => %d,%d\n", input[index],left1,left2);
  134.                 }
  135.         }
  136. }
  137. int main(int argc, char *argv[])
  138. {
  139.         vector<int> input,newi;
  140.         init();
  141.         readArg(argc, argv,input);
  142.         if(test_state(input)==0){
  143.                 printf("Lost\n");
  144.         }else{
  145.                 int i,j;
  146.                 for(i=0;i<input.size();i++){
  147.                         if(i==0||input[i]!=input[i-1]){
  148.                                 for(j=0;j<=(input[i]-1)/2;j++)tryremoveone(input,i,j);
  149.                                 for(j=0;j<input[i]/2;j++)tryremovetwo(input, i, j);
  150.                         }
  151.                 }
  152.         }
  153. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-10-27 23:19:56 | 显示全部楼层
本帖最后由 小铃铛 于 2017-10-28 00:52 编辑

。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-24 06:24 , Processed in 0.058539 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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