看上去很复杂的一道博弈,其实只要稍微分析就会发现情况其实很少很简单。。
斌牛的解释十分详细,我就不赘述了。。http://www.cnblogs.com/staginner/archive/2011/09/10/2173317.html
这里采用数组存储顺序可以大大减少代码的复杂程度,incs存储的是占用这个格子是会给自己留下稳定占位的个数,-1代表给对手留下了一个稳定占位。
#include<stdio.h> #include<string.h> /* Alice:15>3~6>11~14>7~8>9~10>1 Bob :15>3~6>11~14~9~10>7~8>2 */ int pre[][14]={{15,5,6,3,4,11,12,13,14,7,8,9,10,1}, {15,3,4,5,6,11,12,13,14,9,10,7,8,2}}; int incs[] ={ 1,1,1,0,0,0,0, 0, 0, 0, 0,-1,-1,1}; int cas,grd[20],scr[2]; int main(){ scanf("%d",&cas); for(int ca=1;ca<=cas;ca++){ int sum=0,cur=1; for(int i=1;i<=15;i++)scanf("%d",&grd[i]),sum+=grd[i]; scr[0]=scr[1]=0; while(sum>0){ cur^=1; int i=-1; for(i=0;i<14;i++){ if(grd[pre[cur][i]]==0)continue; incs[i]>0?scr[cur]+=incs[i]:scr[cur^1]-=incs[i]; sum--,scr[cur]++,grd[pre[cur][i]]--; break; } } printf("Case #%d: ",ca); printf(scr[0]>scr[1]?"Alice\n":"Bob\n"); } return 0; }