您的位置:首页 > 其它

蓝桥杯 高僧斗法(nim博弈)

2017-04-19 12:21 225 查看
只为写一篇与网上博文不相同的代码,我的代码的主要思想是:移动某个位置的石子(小和尚),奇数位向前移动会减少当前一组的nim值,偶数位向前移动会增加当前组的nim值。因此使nim和为0的情况(因为可使某组nim增加或减少)不仅仅只有移动奇数堆,所以不是阶梯博弈。

#include <algorithm>
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
int jk[105], hk[105];
char c;
int main(){
int i, n, k, ans, m, xr, j;
n = 1, xr = 0;
while(scanf("%d", &k)){
c = getchar();
jk[n++] = k;
if(c == '\n') break;
}
--n; m = n/2;
for(i = 2; i <= n; i += 2){
hk[i/2] = jk[i] - jk[i-1] - 1;
xr ^= hk[i/2];
}
if(xr == 0){
cout << -1 << endl;
}
else{
for(i = 1; i < n; ++i){
for(j = 1; jk[i]+j < jk[i+1]; ++j){
if(i%2 == 1){
hk[(i+1)/2] -= j;
}
else if(i/2 > 0) hk[i/2] += j;
ans = 0;
for(int l = 1; l <= m; ++l){
ans ^= hk[l];
}
if(ans == 0){
printf("%d %d\n", jk[i], jk[i]+j);
break;
}
if(i%2 == 1){
hk[(i+1)/2] += j;
}
else if(i/2 > 0) hk[i/2] -= j;
}
}
}
return 0;
}

不懂我的代码的可以评论问我,继续加油~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: