hdu_5754_Life Winner Bo(博弈)

题目链接:hdu_5754_Life Winner Bo

题意:

一个棋盘,有国王,车,马,皇后四种棋子,bo先手,都最优策略,问你赢的人,如果双方都不能赢就输出D

题解:

全部都可以直接推公式, 这里我推出前两种比较简单的,后面的模拟打个表就行了

 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 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/5709221.html