zoukankan      html  css  js  c++  java
  • hdu 4111 Alice and Bob

    组合游戏题;

    组合游戏的规则:

    1.必败态的所有后继都是必胜态;

    2.必胜态最少有一个必败的后继;

    这里的必胜态是f[1][0][0][0];

    其中f[a][b][c][d]表示有a个1,b个2,c个3,d个4是不是一个必胜态;

    可以认为大于3的奇数等同于3,大于4的偶数等同于4.

    然后递归求解;

     1 #include <iostream>
     2 using namespace std;
     3 
     4 bool vis[51][51][51][51];
     5 bool f[51][51][51][51];
     6 int F(int a,int b,int c,int d)
     7 {
     8     if (!vis[a][b][c][d])
     9     {
    10         //单堆减小一个的情况
    11        if (a>=1&&!F(a-1,b,c,d)) f[a][b][c][d]=true;
    12        if (b>=1&&!F(a+1,b-1,c,d)) f[a][b][c][d]=true;
    13        if (c>=1&&!F(a,b+1,c-1,d)) f[a][b][c][d]=true;
    14        if (d>=1&&!F(a,b,c+1,d-1)) f[a][b][c][d]=true;
    15         //两两合并的情况
    16        if (a>=2&&!F(a-2,b+1,c,d)) f[a][b][c][d]=true;
    17        if (b>=2&&!F(a,b-2,c,d+1)) f[a][b][c][d]=true;
    18        if (c>=2&&!F(a,b,c-2,d+1)) f[a][b][c][d]=true;
    19        if (d>=2&&!F(a,b,c,d-2+1)) f[a][b][c][d]=true;
    20 
    21        if (a>=1&&b>=1&&!F(a-1,b-1,c+1,d)) f[a][b][c][d]=true;
    22        if (a>=1&&c>=1&&!F(a-1,b,c-1,d+1)) f[a][b][c][d]=true;
    23        if (a>=1&&d>=1&&!F(a-1,b,c+1,d-1)) f[a][b][c][d]=true;
    24        if (b>=1&&c>=1&&!F(a,b-1,c-1+1,d)) f[a][b][c][d]=true;
    25        if (b>=1&&d>=1&&!F(a,b-1,c,d-1+1)) f[a][b][c][d]=true;
    26        if (c>=1&&d>=1&&!F(a,b,c-1+1,d-1)) f[a][b][c][d]=true;
    27 
    28        vis[a][b][c][d]=true;
    29     }
    30     return f[a][b][c][d];
    31 }
    32 
    33 int main()
    34 {
    35     int t,ca=1;
    36     cin>>t;
    37     f[1][0][0][0]=1;
    38     while(t--)
    39     {
    40         int n,a=0,b=0,c=0,d=0;
    41         cin>>n;
    42         for (int i=0;i<n;i++)
    43         {
    44             int t;
    45             cin>>t;
    46             if (t==1) a++;
    47             else if (t==2) b++;
    48             else if (t%2==1) c++;
    49             else d++;
    50         }
    51         cout<<"Case #"<<ca++<<": "<<(F(a,b,c,d)?"Alice":"Bob")<<endl;
    52     }
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    尾递归
    gcc/g++ 命令
    GCC输出带C源代码的汇编文件
    linux下Ctrl命令组合
    静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)
    VS2010-MFC(菜单:菜单及CMenu类的使用)
    VS2010-MFC(菜单:VS2010菜单资源详解)
    VS2010-MFC(常用控件:标签控件Tab Control 下)
    VS2010-MFC(常用控件:标签控件Tab Control 上)
    VS2010-MFC(常用控件:树形控件Tree Control 下)
  • 原文地址:https://www.cnblogs.com/yours1103/p/3407419.html
Copyright © 2011-2022 走看看