师时隔几个月后,在看博弈NIM终于懂了,做出了第一道根据所有堆的异或和的题
题意:在一个Si容器中,输入可以行走的步数,然后在下面T组测试数据中,输入堆的情况

#include<stdio.h> #include<algorithm> using namespace std; //数组超是开小了 还是开大了 int enable[101];//可以行走的步数 int SG[10001];//SG的数组大小是一堆石子的大小而不是数组的多少的大小 要区别 int k; bool cmp(int &a,int &b) { return a<b; } int get_SG(int a) { int temp,i; int judge[110]={0};//用来寻找mex点 for (i=0;i<k;i++) { temp=a-enable[i]; if(temp<0) break; if(SG[temp]==-1) SG[temp]=get_SG(temp); judge[SG[temp]]=1; } for (i=0;;i++) if(judge[i]==0) return i; } int main() { int T,i,n,am,j; while(scanf("%d",&k) && k) { for (i=0;i<k;i++) scanf("%d",&enable[i]); sort(enable,enable+k,cmp);//这里是题目的坑。。。 memset(SG,-1,sizeof(SG)); scanf("%d",&T); for (i=0;i<T;i++) { scanf("%d",&n); int ans=0; for (j=0;j<n;j++)//这里是第二次错了,当前面循环有i的时候这里不可以用i { scanf("%d",&am); if(SG[am]==-1) SG[am]=get_SG(am); ans^=SG[am]; } if(ans) printf("W"); else printf("L"); } printf("\n"); } return 0; }