zoukankan      html  css  js  c++  java
  • “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 I.丢史蒂芬妮

    丢史蒂芬妮

    发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:05   时间限制: 1000ms   内存限制: 128M

    有一天,空和白很无聊,决定玩盛大游戏,考虑到两个人玩,他们随便掏了一个游戏出来:在一个n 的棋盘上,首先把史蒂芬妮·多拉放在左上角(1,1 的位置。每次一个人可以将她往下,往右,往右下丢一格。当前回合,谁不能丢史蒂芬妮,谁就输了。(注意,不可以把活人丢出棋盘啦!)游戏总是空先手。

    白说,这是一个垃圾游戏!我们每次把史蒂芬妮丢素数个位置吧!(换句话说,每次丢 或…格)空答应了。

    我们都知道,空和白都很聪明,不管哪方存在一个可以必胜的最优策略,都会按照最优策略保证胜利。

    玩了一局,空已经知道了这个游戏的套路,现在他决定考考你,对于给定的 ,空是赢是输?如果空必胜,输出“Sora”(无引号);反之,输出“Shiro”(无引号)。

    第一行有一个T表示数组组数,1<=T<100000 
    从第二行开始,每行为棋盘大小, 分别表示行列。
    1=<n<=500 1=<m<=500 

    对于每组数据,按题目要求输出。

    复制
    4
    1 1
    2 2
    10 10
    30 30
    
    Shiro
    Shiro
    Shiro
    Sora
    

    题目可真是坑啊,一开始没看到还可以往右下丢,dp[i][j]代表往下丢i格,往右丢j格的胜负
    dp[i][j]可以想象成先在(1,1)往下方向丢t格,从(1+t,1)往(i,j)还需丢dp[i-1-t][j-1]格,那么便可以由子结构推出。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<map>
    #include<cmath>
    #include<set>
    #include<stack>
    #define ll long long
    #define pb push_back
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)>(y)?(y):(x))
    #define cls(name,x) memset(name,x,sizeof(name))
    #define pos first
    #define index second
    #define mp make_pair
    using namespace std;
    const int inf=1e9+10;
    const ll llinf=1e16+10;
    const int maxn=5e2+10;
    const int maxm=1e2+10;
    const int mod=1e9+7;
    int n,m;
    int dp[maxn][maxn];
    void init()
    {
        int fac[maxn];
        int k=0;
        bool prime[maxn];
        cls(prime,0);
        for(int i=2;i<maxn;i++)
        {
            if(prime[i]==0)
            {
                for(int j=2;i*j<maxn;j++)
                    prime[i*j]=1;
                fac[k++]=i;
            }
        }
        cls(dp,0);
        for(int i=0;i<maxn;i++)
            for(int j=0;j<maxn;j++)
            {
                for(int t=0;fac[t]<=i;t++)
                    if(dp[i-fac[t]][j]==0)
                        dp[i][j]=1;
                for(int t=0;fac[t]<=j;t++)
                    if(dp[i][j-fac[t]]==0)
                        dp[i][j]=1;
                for(int t=0;fac[t]<=j&&fac[t]<=i;t++)
                    if(dp[i-fac[t]][j-fac[t]]==0)
                        dp[i][j]=1;
            }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int ncas;
        scanf("%d",&ncas);
        init();
        while(ncas--)
        {
            scanf("%d %d",&n,&m);
            printf("%s
    ",dp[n-1][m-1]==0?"Shiro":"Sora");
        }
        return 0;
    }
     
  • 相关阅读:
    ioS开发之CoreLocation(GPS定位)
    iOSiOS开发之退出功能(易错)
    iOS开发之判断横竖屏切换
    iOS开发之左右抖动效果
    iOS开发之UIPopoverController
    thinkphp or查询
    Invalid left-hand side in assignment
    实现input表单从右向左输入
    thinkPhp不为空查询
    array_filter()用法
  • 原文地址:https://www.cnblogs.com/mgz-/p/7172198.html
Copyright © 2011-2022 走看看