题目链接  Hrbust 2320

用三进制来存储整个棋盘的状态。

设$dp[status][now]$为轮到$now$下棋的时候是必胜必败还是平局。

那么若当前能延伸出的所有状态中存在必败态的,则当前状态为必胜态。

否则看所有延伸出的所有状态中是否存在一个平局态,如果存在则当前状态为平局。

否则当前状态为必败态。

平局局面:当棋盘已经被下满并且没有任意$3$个棋子连起来的时候则平局。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7.  
  8. const int N = 2e4 + 10;
  9. const char *sss = ".ox~";
  10.  
  11. int a[3][3];
  12. int f[N][2];
  13. char ch[2];
  14. int T;
  15. int s, x;
  16. int ans;
  17.  
  18. int calc(int a[3][3]){
  19. int ret = 0;
  20. rep(i, 0, 2){
  21. rep(j, 0, 2){
  22. ret = ret * 3 + a[i][j];
  23. }
  24. }
  25.  
  26. return ret;
  27. }
  28.  
  29. int solve(int s, int x){
  30. if (~f[s][x]) return f[s][x];
  31. int c[3][3];
  32. memset(c, 0, sizeof c);
  33.  
  34. int xx = s;
  35. dec(i, 2, 0){ dec(j, 2, 0){ c[i][j] = xx % 3; xx /= 3; }}
  36.  
  37. if (c[0][0] && c[0][0] == c[0][1] && c[0][1] == c[0][2] && c[0][0] != x) return f[s][x] = 1;
  38. if (c[1][0] && c[1][0] == c[1][1] && c[1][1] == c[1][2] && c[1][0] != x) return f[s][x] = 1;
  39. if (c[2][0] && c[2][0] == c[2][1] && c[2][1] == c[2][2] && c[2][0] != x) return f[s][x] = 1;
  40. if (c[0][0] && c[0][0] == c[1][0] && c[1][0] == c[2][0] && c[2][0] != x) return f[s][x] = 1;
  41. if (c[0][1] && c[0][1] == c[1][1] && c[1][1] == c[2][1] && c[2][1] != x) return f[s][x] = 1;
  42. if (c[0][2] && c[0][2] == c[1][2] && c[1][2] == c[2][2] && c[2][2] != x) return f[s][x] = 1;
  43. if (c[0][0] && c[0][0] == c[1][1] && c[1][1] == c[2][2] && c[0][0] != x) return f[s][x] = 1;
  44. if (c[0][2] && c[0][2] == c[1][1] && c[1][1] == c[2][0] && c[0][2] != x) return f[s][x] = 1;
  45.  
  46. int yy = 0;
  47. rep(i, 0, 2) rep(j, 0, 2) if (c[i][j] == 0) yy = 1;
  48. if (!yy) return f[s][x] = 0;
  49.  
  50. int ff[11];
  51. memset(ff, 0, sizeof ff);
  52. int cnt = 0;
  53. rep(i, 0, 2){
  54. rep(j, 0, 2){
  55. if (c[i][j]) continue;
  56. c[i][j] = x;
  57. int ss = calc(c);
  58. ++cnt;
  59. ff[cnt] = solve(ss, 3 - x);
  60. c[i][j] = 0;
  61. }
  62. }
  63.  
  64. int ret0 = 0, ret2 = 0;
  65. rep(i, 1, cnt){
  66. if (ff[i] == 1) ret2 = 1;
  67. else if (ff[i] == 0) ret0 = 1;
  68. }
  69.  
  70. if (ret2) return f[s][x] = 2;
  71. else if (ret0) return f[s][x] = 0;
  72. else return f[s][x] = 1;
  73. }
  74.  
  75. void init(){
  76. rep(i, 0, 2){
  77. rep(j, 0, 2){
  78. scanf("%s", ch);
  79. if (ch[0] == '.') a[i][j] = 0;
  80. else if (ch[0] == 'o') a[i][j] = 1;
  81. else if (ch[0] == 'x') a[i][j] = 2;
  82. }
  83. }
  84.  
  85. scanf("%s", ch);
  86. if (ch[0] == 'o') x = 1;
  87. else x = 2;
  88. s = calc(a);
  89. }
  90.  
  91. int main(){
  92.  
  93. memset(f, -1, sizeof f);
  94.  
  95. scanf("%d", &T);
  96. while (T--){
  97. init();
  98. ans = solve(s, x);
  99. if (x == 2){
  100. if (ans == 2) puts("x win!");
  101. else if (ans == 1) puts("o win!");
  102. else puts("tie!");
  103. }
  104.  
  105. else{
  106. if (ans == 2) puts("o win!");
  107. else if (ans == 1) puts("x win!");
  108. else puts("tie!");
  109. }
  110. }
  111.  
  112. return 0;
  113. }

  

Hrbust 2320 OX (博弈)的更多相关文章

  1. 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move

    poj  1568:Find the Winning Move   [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...

  2. hdu----(1849)Rabbit and Grass(简单的尼姆博弈)

    Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. HDU 5754 Life Winner Bo 组合博弈

    Life Winner Bo Problem Description   Bo is a "Life Winner".He likes playing chessboard gam ...

  4. HDU 2509 Nim博弈变形

    1.HDU 2509  2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...

  5. HDU 1907 Nim博弈变形

    1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...

  6. 51nod1072(wythoff 博弈)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1072 题意: 中文题诶~ 思路: 博弈套路是有的, 找np局 ...

  7. ACM: NBUT 1107 盒子游戏 - 简单博弈

     NBUT 1107  盒子游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:  Practice  Appoint ...

  8. 【转】ACM博弈知识汇总

    博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍 ...

  9. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

随机推荐

  1. Linux命令之---rm

    命令简介 rm命令为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当 ...

  2. Java程序占用实际内存大小

    很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存.堆只是影响Java程序占用内存数量的一个因素.要更好的理解你的J ...

  3. jni 调用

    Event 0 on null Unexpected event 0 on /storage/emulated/0/Books/null

  4. Spring Boot 开发系列一 开发环境的一些九九

    从今天开始写这个Spring Boot 开发系列,我是第二周学习JAVA的,公司号称springboot把JAVA的开发提升到填空的能力,本人是NET转JAVA的,想看看这个填空的东西到底有多强.废话 ...

  5. Tensorflow实现Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)

    Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)   导语:Mask R-CNN是Faster R-CNN的扩展形式,能够有效地检测图像中的目标,同时还能为每个实例生成一个 ...

  6. 【N-Queens】cpp

    题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...

  7. 【Luogu P1120】小木棍

    题目: 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过$50$.现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.给出每段小木棍的长度,编程 ...

  8. Matlab freqs 函数

    freqs 模拟滤波器的频率响应 语法: h = freqs(b,a,w)[h,w] = freqs(b,a)[h,w] = freqs(b,a,f)freqs(b,a) 描述: freqs 返回一个 ...

  9. JavaWeb笔记(二)Servlet

    Tomcat目录简介 bin--可执行文件 conf--配置文件 lib--依赖jar包 logs--日志文件 temp--临时文件 webapps--默认项目部署路径 work--存放运行时的数据 ...

  10. Codeforces Round #418 (Div. 2) A+B+C!

    终判才知道自己失了智.本场据说是chinese专场,可是请允许我吐槽一下题意! A. An abandoned sentiment from past shabi贪心手残for循环边界写错了竟然还过了 ...