【自用复习】牛客每日一题2026.4.22
参考OvO_CYX的题解原题链接一开始还在想没放的部分组成的连通块数量和胜败态的关系但是很复杂而且很难列出都没放的情况属于哪种状态因为位置只有16个有2 16 65535 2^{16}6553521665535种棋局情况暴力搜索得到每个棋局的状态根据SG定理后继一个状态为必败态那么本状态为必胜态intdx[4]{1,-1,0,1};intdy[4]{0,1,1,1};vectorintst(N,-1);intarray_to_num(vectorvectorinta){intbt0,res0;forr(i,0,3){forr(j,0,3)res(1bt)*a[i][j],bt;}returnres;}vectorvectorintnum_to_array(intnum){vectorvectorinta(5,vectorint(5));forr(i,0,3){forr(j,0,3){intbti*4j;a[i][j]((numbt)1);}}returna;}intcnt0;voiddfs(intnow){if(st[now]!-1)return;cnt;st[now]0;vectorvectorintanownum_to_array(now);// 判断now状态输赢forr(i,0,3){forr(j,0,3){if(anow[i][j]0){// 先放一个anow[i][j]1;intnnowarray_to_num(anow);dfs(nnow);st[now]|(st[nnow]0);// 后继状态输 本状态赢anow[i][j]0;// 恢复现场 保持本次now不变 用于后续{i,j}的判断// 如果不恢复 遍历状态会少// 放多个forr(d,0,3){// 每个方向有单独的anxt 省去回复现场vectorvectorintanxtanow;anxt[i][j]1;intnxi,nyj;forr(s,1,2){nxdx[d],nydy[d];if(nx0||nx3||ny0||ny3||anxt[nx][ny])break;anxt[nx][ny]1;intnxtarray_to_num(anxt);dfs(nxt);st[now]|(st[nxt]0);}}}}}}voidinit(){// 预处理出每个棋局的状态st[65535]0;// 对先手必败dfs(0);}voidsolve(){vectorvectorintmp(5,vectorint(5));intnum0;forr(i,0,7){forr(j,0,min(i,7-i-1)){// couti jendl;charc;cinc;intid;if(i3)idij*3;elseid(3(i-3)*4j*3);intxid/4,yid%4;mp[x][y](c*);}}cout(st[array_to_num(mp)]?Alice:Bob)endl;}signedmain(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int_1;init();// coutcntendl;cin_;while(_--){solve();}return0;}