zoukankan      html  css  js  c++  java
  • BZOJ 2940: [Poi2000]条纹(Multi-Nim)

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 110  Solved: 70
    [Submit][Status][Discuss]

    Description

     
        条纹游戏是一个双人的游戏。所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色、绿色和蓝色。所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z*1,所有的蓝色条纹的尺寸是n*1,这里c,z,n是正整数。每种颜色的条纹每个游戏者都拥有无限多个。
           一个棋盘是一个尺寸为p*1的长方形,由p个1*1的方格组成。
           游戏者轮流走,每一步都是由一个游戏者任选一种长方形条纹覆盖到棋盘上,并要求遵循以下规则:
    l        条纹不能伸出棋盘之外。
    l        不能覆盖在已有的条纹之上(即使部分也不行)。
    l        条纹的边缘必须与棋盘方格的边缘相重叠。谁不能再走,谁就输了。
     
    先手是指在游戏中第一个走的游戏者。那么是否不管后手怎么走,先手都有必胜策略呢?
    任务:
    写一个程序:
    l        读入条纹的尺寸以及至少一个棋盘的尺寸。
    l        对每一个给出的棋盘判断先手是否必胜。
    l        将结果输出。
     

    Input

     第一行包含三个整数c,z,n(1<=c,z,,n<=1000),表示三种条纹的长度,依次为红色,绿色以及蓝色。每两个数之间都用空格隔开。
           文件的第二行包括一个整数m(1 <= m <= 1000)表示需要考虑的不同棋盘个数。以下3到m+2行每行包括一个整数p(1<=p<=1000)。第i+2行表示第i个棋盘的长度。
     

    Output

       应当包含m行。只有一个数字应当被写入文件的第i行:
    l        1—如果对第i个棋盘先手有必胜策略。
    l        2—其它。
     

    Sample Input

    1 5 1


    3
    1
    5
    6


    Sample Output


    1
    1
    2

    HINT

     

    Source

    随便yy了一个做法交上去居然A了QWQ....

    这题的模型应该是类似于Multi-Nim。

    对于拆出来的游戏的SG异或起来就是当前游戏的SG

    然后枚举3个线段放在哪儿。

    #include<cstdio>
    #include<cstring>
    const int MAXN=1001;
    inline int read()
    {
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int f[4],N=1001,SG[MAXN],S[MAXN];
    int main()
    {
        #ifdef WIN32
        freopen("a.in","r",stdin);
        #else
        #endif
        for(int i=1;i<=3;i++) f[i]=read();
        for(int i=1;i<=N;i++)
        {
            memset(S,0,sizeof(S));
            for(int j=1;j<=3&&f[j]<=i;j++)
                for(int k=0;k<=i-f[j];k++)
                    S[ SG[k]^SG[i-k-f[j]] ] =1;
            for(int j=0;;j++) if(!S[j]) {SG[i]=j;break;}
        }
        int QwQ=read();
        while(QwQ--)
        {
            int p=read();
            puts(SG[p]?"1":"2");
        }
        return 0;
    }
  • 相关阅读:
    菜鸟小结
    计算几何题目整理(转)
    poj 3299 Humidex
    基于C的文件操作(转)
    poj 1328 Radar Installation
    poj 1321 棋盘问题(dfs)
    poj 3302 Subsequence
    C# 资产(Property) 与普通字段(field)变量的区别
    Jumping into Cloud, Be Sure You Know How to Get Out
    关于语言的想法。
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/8468781.html
Copyright © 2011-2022 走看看