zoukankan      html  css  js  c++  java
  • hdu 4559 涂色游戏(SG)

    在一个2*N的格子上,Alice和Bob又开始了新游戏之旅。 

    这些格子中的一些已经被涂过色,Alice和Bob轮流在这些格子里进行涂色操作,使用两种涂色工具,第一种可以涂色任意一个格子,第二种可以涂色任意一个2*2的格子。每一轮游戏里,他们可以选择一种工具来涂色尚未被染色的格子。需要注意,涂色2*2的格子时,4个格子都应当未被涂色。最后一步涂满所有格子的玩家获胜。 

    一如既往,Alice先手,最优策略,谁是赢家?

    在一个2*N的格子上染色 每次可以染1*1的格子 或者2*2的格子 最后涂满所有格子的人胜 m为已染色格子的个数 Alice先手

    1*1的点SG值为1 sg【i】表示连续2*i的SG值 sg【3】 就是连续2*3空白格子  最后对整个棋盘分段 分为连续空白的2*i格子 和 某列中涂过色的格子

    假如n = 3
    在一个已经涂了一个1*1个格子的情况下,有以下子情况: 
    情况1 假如是在第1行第1列的那个格子已经被涂了色

              整个棋盘可分为:连续0列的格子+第1列剩下的那一个格子+最后连续2列的格子

              ans=sg[0]^1^sg[2]

    情况2 假如是在第1行第2列的那个格子已经被涂了色

              整个棋盘可分为:连续1列的格子+第2列剩下的那一个格子+最后连续1列的格子

              ans=sg[1]^1^sg[1]

    情况3 假如是在第1行第3列的那个格子已经被涂了色(其实这个同理情况1)

              整个棋盘可分为:连续2列的格子+第3列剩下的那一个格子+连续0列的格子

              ans=sg[2]^1^sg[0]

     

    在一个已经涂一个2*1个格子的情况下  那么有以下几种子情况 

    情况1 假如是在第1行第1列的那2个格子已经被涂了色

              整个棋盘可分为:连续0列的格子+最后连续2列的格子

              ans=sg[0]^sg[2]

    情况2 假如是在第1行第2列的那2个格子已经被涂了色

              整个棋盘可分为:连续1列的格子+最后连续1列的格子

              ans=sg[1]^sg[1]

    情况3 同理情况1

    为什么1*1的SG值为1

    它的后继,涂一个格子,然后没有空白格子,后继值也就是sg[0] = 0

    取自然数的补集,再从集合里去最小元素,就是1

    sg[1]怎么求,他的后继就是涂了一个格子后,剩1个格子。

    sg[1]的后继的sg值为1,取补取最小值后,为0,sg[1]=0

    sg[2]怎么求,他的后继

    后继1:涂了2*2的格子后,后继的sg值为0(sg[0])

    后继2:涂1个1*1格子后,剩一个格子和一个2*1,也就是1^s[1]=1

    sg[2]的后继的sg值有0,1,取补取最小值后,为2,sg[2]=2

    sg[3]怎么求,他的后继

    后继1:涂1个1*1格子后,剩一个格子和一个2*2,也就是1^s[2]=3

    后继2:涂1个1*1格子后,剩一个格子和2个2*1,也就是1^s[1]^sg[1]=1

    后继3:涂1个2*2,剩一个2*1,也就是sg[1]=0

    sg[3]的后继的sg值有0,1,3,取补取最小值后,为2,sg[3]=2

    sg[4]........

    Sample Input
    2
    2 0 // n m
    2 2 //n m
    1 1 //已染色格子的坐标
    2 2

    Sample Output
    Case 1: Alice
    Case 2: Bob

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <string>
     6 # include <cmath>
     7 # include <queue>
     8 # include <list>
     9 # define LL long long
    10 using namespace std ;
    11 const int MAXN=5000;
    12 int sg[MAXN];
    13 bool vis[MAXN];
    14 bool g[2][MAXN];
    15 int mex(int x)
    16 {
    17     if(sg[x]!=-1)return sg[x];
    18     memset(vis,false,sizeof(vis));
    19     for(int i=0;i<=x-1-i;i++)  //染1*1
    20     {
    21         int tmp=mex(i)^mex(x-1-i)^1;
    22         vis[tmp]=true;
    23     }
    24     for(int i=0;i<=x-2-i;i++)//染2*2
    25     {
    26         int tmp=mex(i)^mex(x-2-i);
    27         vis[tmp]=true;
    28     }
    29     for(int i=0;;i++)
    30         if(!vis[i])
    31         {
    32             sg[x]=i;
    33             break;
    34         }
    35     return sg[x];
    36 }
    37 
    38 int main()
    39 {
    40 
    41     memset(sg,-1,sizeof(sg));
    42     sg[0]=0;
    43     for(int i=1;i<5000;i++)
    44         sg[i]=mex(i);
    45     int T;
    46     scanf("%d",&T);
    47     int iCase=0;
    48     while(T--)
    49     {
    50         int n,m;
    51         scanf("%d%d",&n,&m);
    52         memset(g,false,sizeof(g));
    53         int u,v;
    54         while(m--)
    55         {
    56             scanf("%d%d",&u,&v);
    57             u--;v--;
    58             g[u][v]=true;
    59         }
    60         int len=0;
    61         int ans=0;
    62         for(int i=0;i<n;i++)
    63         {
    64             if(g[0][i]||g[1][i])
    65             {
    66                 ans^=sg[len];
    67                 len=0;
    68                 if(g[0][i]&&g[1][i])continue;
    69                 ans^=1;
    70             }
    71             else len++;
    72         }
    73         ans^=sg[len];
    74         iCase++;
    75         if(ans)printf("Case %d: Alice
    ",iCase);
    76         else printf("Case %d: Bob
    ",iCase);
    77     }
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    SQL 执行进展优化
    初识SQL 执行顺序
    前端模块化开发的价值(转)
    js 闭包之一
    js模块开发(一)
    简单说说call 与apply
    js 爱恨情仇说 this
    说说 js String
    $Ajax简单理解
    SQL-如何使用 MongoDB和PyMongo。
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/4841971.html
Copyright © 2011-2022 走看看