mathe 发表于 2017-3-3 20:39
25=>18,6, 你至少应该先看一下别人的结论。过程即使看不懂,总可以试验一下结论吧
不明白你的意思,你认为25不是奇异数? 取成18+6是活的还?,后手可以取成18+2+2
25是先手必输。
我的意思是这个奇异数的判断很简单,没有原帖上分析的那么复杂,有通项公式可以求得 14+2+2+2
看链接78#中结论 mathe 发表于 2017-3-3 20:39
25=>18,6, 你至少应该先看一下别人的结论。过程即使看不懂,总可以试验一下结论吧
你怎么知道我没看?
这个数列应该是1,4,9,12,20,25....
验证一下看看,你25=>18,6我17+6
你自己玩吧
重新从csdn找到以前编译的代码,可以在windows命令行运行。
比如输入
cnext.exe 17 6
输出
17=>1+14
17=>2+13
17=>7+8
6=>5
也就是说接下去有四种选择方案可以赢,比如将17变成1和14或6变成5等 从网页中搜索了源代码,不知道是否能够使用
#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-28 00:52 编辑
。。。
页:
1
[2]