小铃铛 发表于 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是先手必输。

我的意思是这个奇异数的判断很简单,没有原帖上分析的那么复杂,有通项公式可以求得

mathe 发表于 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

mathe 发表于 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等

mathe 发表于 2017-3-5 08:40:24

从网页中搜索了源代码,不知道是否能够使用

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 1000
int s;
//create state array if the user could remove all chesses
//Given a list of number n1,n2,...,nh, the user wins iff
// s^s^...^s==0
//if users could remove the last chess
void init()
{
        int st,i,j;
        s=0;s=1,s=2;
        for(i=3;i<MAX;i++){
                for(j=0;j<MAX;j++)st=0;
                st]=1,st]=1;
                for(j=1;j<=(i-1)/2;j++){
                        int k=i-1-j;
                        st^s]=1;
                        k=i-2-j;
                        st^s]=1;
                }
                for(j=0;j<MAX;j++)if(st==0)break;
                s=j;
        }
}
int odd(int x){return (x&1)!=0;}
int even(int x){return (x&1)==0;}
//Function to test whether it is a win state if the last chess should not be removed
//return 1 for win state and 0 for lost state
//It is almost same as the case when last chess could be removed except for
// some special cases related to number 1,4,5,9,12,17,20,25
int test_state(const vector<int>& a)
{
        int s1,s4,s5,s9,s12,s17,s20,s25;
        int i,r,so=0;
        s1=s4=s5=s9=s12=s17=s20=s25=0;
        for(r=0,i=0;i<a.size();i++){
                switch(a){
                        case 1:s1++;break;
                        case 4:s4++;break;
                        case 5:s5++;break;
                        case 9:s9++;break;
                        case 12:s12++;break;
                        case 17:s17++;break;
                        case 20:s20++;break;
                        case 25:s25++;break;
                        default:so++;break;
                }
                r^=s];
        }
        if(odd(s9)&&even(s4+s1)&&so+s5+s12+s17+s20+s25==0||
                        s12==1&&even(s1+s4)&&so+s5+s9+s17+s20+s25==0||
                        odd(s5)&&odd(s1+s4)&&so+s9+s12+s17+s20+s25==0||
                        even(s5)&&so+s9+s12+s17+s20+s25==0||
                        even(s9+s12+s17)&&so+s5+s25==0||
                        even(s9+s12+s17)&&odd(s1+s4+s20)&&s25==1&&so+s5==0||
                        odd(s1+s4)&&odd(s9)&&s25==1&&so+s5+s12+s17+s20==0){
                r=!r;
        }
        return r!=0;
}
//read input number lists
//user should input
//programname n1 n2 n2 ... nh
void readArg(int argc, char *argv[], vector<int>& input)
{
        int i;
        input.clear();
        for(i=1;i<argc;i++){
                int u=atoi(argv);
                if(u<=0||u>=MAX){
                        fprintf(stderr,"input %d not in range \n",u,MAX-1);
                        exit(-1);
                }
                input.push_back(u);
        }
        sort(input.begin(),input.end());
}
//test the case that the offset'th chess of line index is removed
// If it result in a lost state, output it
void tryremoveone(const vector<int> input, int index, int offset)
{
        vector<int> outv;
        int i;
        for(i=0;i<index;i++)outv.push_back(input);
        if(offset==0){
                if(input>1)outv.push_back(input-1);
        }else{
                outv.push_back(offset);
                if(offset<input-1)outv.push_back(input-1-offset);
        }
        for(i=index+1;i<input.size();i++)outv.push_back(input);
        if(test_state(outv)==0){
                int left1=offset,left2=input-1-offset;
                if(left1==0&&left2==0)
                        printf("Possible Move: Remove 1\n");
                else if(left1==0){
                        printf("Possible Move: %d => %d\n",input,left2);
                }else if(left2==0){
                        printf("Possible Move: %d => %d\n", input,left1);
                }else{
                        printf("Possible Move: %d => %d,%d\n", input,left1,left2);
                }
        }
}
//test the case that the offset'th and (offset+1)'th chesses of line index are removed
// If it result in a lost state, output it
void tryremovetwo(const vector<int> input, int index, int offset)
{
        vector<int> outv;
        int i;
        if(input<2)return;
        for(i=0;i<index;i++)outv.push_back(input);
        if(offset==0){
                if(input>2)outv.push_back(input-2);
        }else{
                outv.push_back(offset);
                if(offset<input-2)outv.push_back(input-2-offset);
        }
        for(i=index+1;i<input.size();i++)outv.push_back(input);
        if(test_state(outv)==0){
                int left1=offset,left2=input-2-offset;
                if(left1==0&&left2==0)
                        printf("Possible Move: Remove 2\n");
                else if(left1==0){
                        printf("Possible Move: %d => %d\n",input,left2);
                }else if(left2==0){
                        printf("Possible Move: %d => %d\n", input,left1);
                }else{
                        printf("Possible Move: %d => %d,%d\n", input,left1,left2);
                }
        }
}
int main(int argc, char *argv[])
{
        vector<int> input,newi;
        init();
        readArg(argc, argv,input);
        if(test_state(input)==0){
                printf("Lost\n");
        }else{
                int i,j;
                for(i=0;i<input.size();i++){
                        if(i==0||input!=input){
                                for(j=0;j<=(input-1)/2;j++)tryremoveone(input,i,j);
                                for(j=0;j<input/2;j++)tryremovetwo(input, i, j);
                        }
                }
        }
}

小铃铛 发表于 2017-10-27 23:19:56

本帖最后由 小铃铛 于 2017-10-28 00:52 编辑

。。。
页: 1 [2]
查看完整版本: 。。棋子游戏