丢史蒂芬妮

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

描述

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

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

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

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

输入

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

输出

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

样例输入1

4
1 1
2 2
10 10
30 30

样例输出1

Shiro
Shiro
Shiro
Sora

题解:我们可以看出这是一个Grundy博弈问题

每个局面(当前所处的位置)代表一个状态。这个状态如果不是必胜态,那么就是必败态。

且满足,从必败态出发,一定有方法转移到必胜态。并且从必胜态出发,不论怎样走,都将转变为必败态。

这就是一个求grundy数的问题了

我们定义局面(i,j)的grundy数为grundy[i][j],并且设prime[k]是可行的素数步数。

那么,从这个局面可以转移到(i-prime[k],j)或者(i,j - prime[k])或者(i-prime[k],j - prime[k])

所以求grundy数的函数就可以写成这样:

for(int i = 1;i <= 500;i++){for(int j = 1;j <= 500;j++){//set<int> st;memset(st,0,sizeof(st));for(int k = 0;k < cnt;k++){int step = prime[k];if(step < i) st[grundy[i - step][j]]++;if(step < j) st[grundy[i][j - step]]++;if(step < i && step < j) st[grundy[i - step][j - step]] ++ ;}int g = 0;while(st[g] != 0) {g++;}//cout<<g<<endl;grundy[i][j] = g;}//cout<<i<<endl;}

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
const int MAX = 505;
int prime[MAX];
int grundy[MAX][MAX];
int cnt = 0;
int n,m;
int st[100];
void init(){for(int i = 2;i <= 500;i++){int f = 1;for(int j = 2;j*j <= i;j++){if(i%j == 0){f = 0;break;}}if(f){prime[cnt++] = i;}}//for(int i = 1;i <= 500;i++){for(int j = 1;j <= 500;j++){//set<int> st;memset(st,0,sizeof(st));for(int k = 0;k < cnt;k++){int step = prime[k];if(step < i) st[grundy[i - step][j]]++;if(step < j) st[grundy[i][j - step]]++;if(step < i && step < j) st[grundy[i - step][j - step]] ++ ;}int g = 0;while(st[g] != 0) {g++;}//cout<<g<<endl;grundy[i][j] = g;}//cout<<i<<endl;}}
int main(){init();int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);puts((grundy[n][m] == 0) ? "Shiro" : "Sora");}return 0;
}

2017上海金马五校赛 丢史蒂芬妮 博弈问题相关推荐

  1. 上海五校赛 丢史蒂芬妮

    丢史蒂芬妮 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:05   时间限制: 1000ms   内存限制: 128M 描述 有一天,空和白很无聊,决定玩盛大游 ...

  2. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛:I. 丢史蒂芬妮

    丢史蒂芬妮 发布时间: 2017年7月8日 21:37   最后更新: 2017年7月8日 23:24   时间限制: 1000ms   内存限制: 128M 描述 有一天,空和白很无聊,决定玩盛大游 ...

  3. 盛大游戏杯第十五届上海大学程序设计联赛暨上海金马五校赛

    编程1小时,提交4小时 做这种比赛一定要选一个好OJ啊 黑白图像直方图 发布时间: 2017年7月8日 21:00   最后更新: 2017年7月8日 22:38   时间限制: 1000ms   内 ...

  4. shuoj 418 丢史蒂芬妮(素数筛+sg函数)

    丢史蒂芬妮 代码: #include<bits/stdc++.h> using namespace std; const int N=500+5; int SG[N][N]; bool S ...

  5. 2017上海金马五校 购买装备 贪心+二分Check

    购买装备 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:05   时间限制: 1000ms   内存限制: 128M 描述 最近盛大的一款游戏传奇世界极其火爆. ...

  6. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L-K序列

    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L-K序列 链接:https://www.nowcoder.com/acm/contest/91/L 来源:牛客网 题目描述 给一个数组 ...

  7. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A-Wasserstein Distance

    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A-Wasserstein Distance 链接:https://www.nowcoder.com/acm/contest/91/A ...

  8. 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 E-小Y吃苹果

    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 E-小Y吃苹果 链接:https://www.nowcoder.com/acm/contest/91/E 来源:牛客网 题目描述 小Y买 ...

  9. 好久没撸c,第一场回状态的题(埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛

    题目链接: 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 A:Wasserstein Distance ## 题意:有2大堆柱状图的土(总体积相同,问从第一堆土移动到第二堆消耗最少的 ...

最新文章

  1. Android在线开发工具 App Inventor
  2. css之object-fit
  3. Python爬虫入门(1):综述
  4. 【Python】青少年蓝桥杯_每日一题_12.19_输出三位数
  5. 服务端构架干货:快节奏多人游戏的技术实现
  6. 发送邮件_使用 Python 发送电子邮件
  7. AOP——基于AspectJ的注解来实现AOP操作
  8. LINQ to SQL自定义映射表关系(1:N or 1:1)
  9. 打拼10年的数据分析师,终于明白职场鄙视链才是最大的沉没黑洞
  10. (7)numpy.delete删除np数组的某一行或某一列
  11. 如何制作poster以及下载poster模板
  12. dotnet core在Linux下运行的步骤
  13. 南航计算机英语面试经验,南航面试英文自我介绍
  14. 使用HEVC官方编码器HM
  15. Android源码阅读记录
  16. Animated之实例篇
  17. jrtplib学习笔记1
  18. 持续集成服务 Travis CI 教程
  19. AWS Ec2实例挂载S3存储桶实践
  20. 使用网络打印机进行“属性”和“首选项”设置时,弹出个浏览器.exe错误对话框

热门文章

  1. mongorepository查询条件_MongoRepository实现增删改查和复杂查询【支持的查询类型】...
  2. activex java 控件_java 如何调用ActiveX控件??
  3. [PAT乙级]1007 素数对猜想
  4. [C++STL]C++实现list容器
  5. Java LinkedList双向链表源码分析
  6. leetcode 无重复字符的最长子串
  7. 梯度下降:求线性回归
  8. Educational Codeforces Round 88 (Rated for Div. 2) E(数学)
  9. 可持久化3--可持久化01Trie
  10. Infinite Tree