hdu_5754_Life Winner Bo(博弈)
题意:
一个棋盘,有国王,车,马,皇后四种棋子,bo先手,都最优策略,问你赢的人,如果双方都不能赢就输出D
题解:
全部都可以直接推公式, 这里我推出前两种比较简单的,后面的模拟打个表就行了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int i=a;i<=b;++i) 4 using namespace std; 5 typedef long long ll; 6 7 int mp3[1001][1001],mp4[1001][1001],lie[1001],hang[1001],xie[2010]; 8 void init() 9 { 10 for(int i=1000;i>=1;i-=3) 11 { 12 mp3[i][i]=1; 13 if(i-2>=1&&i-1>=1)mp3[i-1][i-2]=2; 14 if(i-1>=1&&i-2>=1)mp3[i-2][i-1]=2; 15 } 16 for(int i=1000;i>=1;i--) 17 { 18 if(hang[i])continue; 19 for(int j=1000;j>=1;j--) 20 { 21 if(lie[j]||xie[1000+i-j])continue; 22 mp4[i][j]=1; 23 hang[i]=1,lie[j]=1,xie[1000+i-j]=1; 24 break; 25 } 26 } 27 } 28 29 int main(){ 30 init(); 31 int t,type,n,m; 32 scanf("%d",&t); 33 while(t--) 34 { 35 scanf("%d%d%d",&type,&n,&m); 36 int nn=1000-n+1,mm=1000-m+1; 37 if(type==1) 38 { 39 if(n&1&&m&1)puts("G");else puts("B"); 40 } 41 else if(type==2) 42 { 43 if(n==m)puts("G");else puts("B"); 44 } 45 else if(type==3) 46 { 47 if(mp3[nn][mm]==1)puts("G"); 48 else if(mp3[nn][mm]==2)puts("B"); 49 else puts("D"); 50 } 51 else if(mp4[nn][mm])puts("G");else puts("B"); 52 } 53 return 0; 54 }