博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2940 条纹
阅读量:6836 次
发布时间:2019-06-26

本文共 1265 字,大约阅读时间需要 4 分钟。

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

解:暴力sg即可,发现复杂度是n²的。

1 #include 
2 3 const int N = 1010; 4 5 int bin[N], sg[N]; 6 7 int main() { 8 int a, b, c, n; 9 scanf("%d%d%d", &a, &b, &c);10 for(int i = std::min(std::min(a, b), c); i <= 1000; i++) {11 memset(bin, 0, sizeof(bin));12 for(int j = 0; j + a <= i; j++) {13 bin[sg[j] ^ sg[i - j - a]]++;14 }15 for(int j = 0; j + b <= i; j++) {16 bin[sg[j] ^ sg[i - j - b]]++;17 }18 for(int j = 0; j + c <= i; j++) {19 bin[sg[j] ^ sg[i - j - c]]++;20 }21 for(int j = 0; ; j++) {22 if(!bin[j]) {23 sg[i] = j;24 break;25 }26 }27 }28 29 scanf("%d", &n);30 for(int i = 1; i <= n; i++) {31 scanf("%d", &a);32 printf("%d\n", sg[a] ? 1 : 2);33 }34 35 return 0;36 }
AC代码

 

转载于:https://www.cnblogs.com/huyufeifei/p/10552259.html

你可能感兴趣的文章
16、SpringBoot-CRUD错误处理机制(3)
查看>>
7、NIO--字符集Charset
查看>>
2-JSF html标签
查看>>
队列queue 代码
查看>>
Python-mysql 权限 pymysql 注入共计
查看>>
HashSet、LinkedHashSet、TreeSet
查看>>
ios 远程推送
查看>>
halcon算子翻译——compose5
查看>>
安装office2010提示要安装MSXML6.10.1129.0解决方法
查看>>
作业6随笔
查看>>
Github提交本地代码
查看>>
python文件操作
查看>>
go 编译protobuf
查看>>
VMD 1.9.1 安装和使用(Centos6.3)
查看>>
2017-12-08高级.net 面试小结
查看>>
201621123018《Java程序设计》第4周学习报告
查看>>
Java学习笔记 Part1 创造工作环境
查看>>
Linux read/write fread/fwrite两者区别
查看>>
Azure中国版 制作镜像 捕捉镜像
查看>>
联合概率、边缘概率、条件概率
查看>>