UVA 1558 - Number Game

题目链接

题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法

思路:利用dp记忆化去求解,要输出方案就枚举第一步就可以,状态转移过程中,选中一个数字,对应的变化写成一个函数,然后就是普通的博弈问题了,必胜态之后必有必败态,必败态之后全是必胜态

代码:

#include <stdio.h>
#include <string.h> const int N = 1050005;
int t, n, w, start, dp[N], ans[25], an; int getnext(int state, int x) {
for (int i = x; i <= 20; i += x)
if (state&(1<<(i - 2)))
state ^= (1<<(i - 2));
for (int i = 2; i <= 20; i++) {
if (state&(1<<(i - 2))) {
for (int j = x; i - j >= 2; j += x) {
if (!(state&(1<<(i - j - 2)))) {
state ^= (1<<(i - 2));
break;
}
}
}
}
return state;
} int dfs(int state) {
if (dp[state] != -1) return dp[state];
if (state == 0) return dp[state] = 0; for (int i = 2; i <= 20; i++) {
if (state&(1<<(i - 2))) {
if (dfs(getnext(state, i)) == 0)
return dp[state] = 1;
}
}
return dp[state] = 0;
} int main() {
int cas = 0;
scanf("%d", &t);
memset(dp, -1, sizeof(dp));
while (t--) {
start = 0; an = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &w);
start |= (1<<(w - 2));
}
for (int i = 2; i <= 20; i++) {
if (start&(1<<(i - 2))) {
if (dfs(getnext(start, i)) == 0)
ans[an++] = i;
}
}
printf("Scenario #%d:\n", ++cas);
if (an) {
printf("The winning moves are:");
for (int i = 0; i < an; i++)
printf(" %d", ans[i]);
printf(".\n");
}
else printf("There is no winning move.\n");
printf("\n");
}
return 0;
}

最新文章

  1. 动态设置 button的 name 的话 闪动的问题 解决
  2. RedRabbit——基于BrokerPattern服务器框架
  3. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)
  4. Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)
  5. python 一些重要的内建异常类
  6. Nginx + Tomcat 动静分离实现负载均衡
  7. Android Parcelable Trans byte[]
  8. JavaScript Boolean(布尔) 对象
  9. RPC基于http协议通过netty支持文件上传下载
  10. 基于TensorFlow的手写中文识别(版本一)
  11. Nancy in .Net Core学习笔记 - 初识Nancy
  12. Qt: 文件、文件夹的操作;
  13. KafkaConsumer 长时间地在poll(long )方法中阻塞
  14. PO ITEM_BOM_工艺路线SQL
  15. CSS预编译器:Sass(进阶),更快的前端开发
  16. asp.net mvc 4 AntiForgery 提供的防伪标记适用于用户“”,但当前用户为“XX” 问题处理记录
  17. ARKit-1
  18. windows 2003 群集
  19. angular2.x 下拉多选框选择组件
  20. SC用法

热门文章

  1. JavaScript获取和设置CheckBox状态
  2. CentOS6.7 下安装git
  3. 解决Android SDK Manager下载太慢问题(转)
  4. 来自GitHub的Android UI开源项目
  5. 循序渐进Socket网络编程(多客户端、信息共享、文件传输)
  6. [BZOJ]3643 Phi的反函数
  7. uva 11536 - Smallest Sub-Array
  8. bootstrapValidator Maximum call stack size exceeded
  9. jQuery插件实现select下拉框左右选择_交换内容(multiselect2side)
  10. SQL建模错误--逗号分隔值