生活随笔
收集整理的這篇文章主要介紹了
HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:點(diǎn)擊查看
題目大意:兩個(gè)人在玩游戲,給出一個(gè) 3 * 3 的棋盤,每個(gè)格子上有數(shù)個(gè)石子,兩人輪流取石子,誰(shuí)先取完某一列或某一行的最后一個(gè)石子就算勝利,一般情況是,每個(gè)人可以取任意一堆中任意數(shù)量的石子(可以直接取完),但兩個(gè)人第一次取的時(shí)候,必須將選擇的一堆全部取完,問先手必勝的前提下,第一次有多少種不同的取石子方案
題目分析:比賽時(shí)將題目想復(fù)雜了,以為是博弈樹上的尼姆博奕,學(xué)了半天博弈樹發(fā)現(xiàn)沒什么用就掛機(jī)了,賽后看了一眼題解后恍然大悟,原來是題目給出的模型還沒有參透
因?yàn)榍皟纱伪仨氁≌?#xff0c;假設(shè)先手取的是 ( x0 , y0 ) , 后手取的是 ( x1 , y1 ) ,顯然兩個(gè)點(diǎn)不能重合,接下來考慮如果兩個(gè)點(diǎn)在同一列或者同一行時(shí),此時(shí)先手接下來只需要將相應(yīng)的第三堆全部拿走即可獲得勝利,也就是說此時(shí)后手肯定不能取和先手位于同一行或者同一列的石子,換句話說,此時(shí)后手只能取相對(duì)于先手斜著的位置,這樣一來,這個(gè)局面就變成了,誰(shuí)取與 ( x0 , y0 ) 和 ( x1 , y1 ) 同一列或同一行的最后一個(gè)棋子就是必?cái)B(tài),轉(zhuǎn)換一下,除了剛才提到的那些棋子外,剩下的所有棋子也就組成了尼姆博弈,然后用異或就能解決了
代碼:
?
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int a[5][5];int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);int w;cin>>w;while(w--){int _xor=0;for(int i=0;i<3;i++)for(int j=0;j<3;j++){scanf("%d",&a[i][j]);_xor^=(a[i][j]-1);}int ans=0;for(int x0=0;x0<3;x0++)//枚舉先手 for(int y0=0;y0<3;y0++){bool flag=true;for(int x1=0;x1<3;x1++)//枚舉后手 for(int y1=0;y1<3;y1++){if(x0==x1||y0==y1)continue;if((_xor^(a[x0][y0]-1)^(a[x1][y1]-1)^(a[3-x0-x1][3-y0-y1]-1)^(a[3-x0-x1][3-y0-y1]))==0){flag=false;goto end;}}end:;ans+=flag;}printf("%d\n",ans);}return 0;
}
?
總結(jié)
以上是生活随笔為你收集整理的HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。