zoukankan      html  css  js  c++  java
  • [POJ3537]Crosses and Crosses

    vjudge

    题意

    有一个(1*N)的棋盘,双方轮流在棋盘上下棋,先形成三个连续棋子者胜。
    (Nle2000)

    sol

    还是要转换成“不能操作者败”的问题。
    如果一方在格子(i)上下了一个棋,那么(i-2,i-1,i+1,i+2)(如果有的话)这些格子一定再也不能下了(因为你一下对方就赢了)
    那么一次下棋相当于把棋盘砍成两半,变成了两个独立的子问题。
    所以直接预处理出(SG)函数。复杂度(O(n^2))

    code

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N = 2005;
    int n,SG[N];
    int getSG(int x)
    {
    	if (x<0) return 0;
    	if (SG[x]!=-1) return SG[x];
    	bool vis[N]={0};
    	for (int i=1;i<=x;++i) vis[getSG(i-3)^getSG(x-i-2)]=1;
    	for (int i=0;i<=2000;++i) if (!vis[i]) return SG[x]=i;
    }
    int main()
    {
    	memset(SG,-1,sizeof(SG));
    	for (int i=3;i<=2000;++i) getSG(i);
    	while (scanf("%d",&n)!=EOF) puts(SG[n]?"1":"2");
    	return 0;
    }
    
  • 相关阅读:
    nextLine() 、nextInt()的跳过问题
    Spring事务管理
    常见web错误码
    connect()函数
    int main(int argc,char*argv[])
    cin.getline函数
    TCP数据报结构以及三次握手(图解)
    TCP报文首部
    strtol函数
    MySQL简介
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8665857.html
Copyright © 2011-2022 走看看