Hrbust 2320 OX (博弈)
题目链接 Hrbust 2320
用三进制来存储整个棋盘的状态。
设$dp[status][now]$为轮到$now$下棋的时候是必胜必败还是平局。
那么若当前能延伸出的所有状态中存在必败态的,则当前状态为必胜态。
否则看所有延伸出的所有状态中是否存在一个平局态,如果存在则当前状态为平局。
否则当前状态为必败态。
平局局面:当棋盘已经被下满并且没有任意$3$个棋子连起来的时候则平局。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 2e4 + 10;
const char *sss = ".ox~"; int a[3][3];
int f[N][2];
char ch[2];
int T;
int s, x;
int ans; int calc(int a[3][3]){
int ret = 0;
rep(i, 0, 2){
rep(j, 0, 2){
ret = ret * 3 + a[i][j];
}
} return ret;
} int solve(int s, int x){
if (~f[s][x]) return f[s][x];
int c[3][3];
memset(c, 0, sizeof c); int xx = s;
dec(i, 2, 0){ dec(j, 2, 0){ c[i][j] = xx % 3; xx /= 3; }} 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;
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;
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;
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;
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;
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;
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;
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; int yy = 0;
rep(i, 0, 2) rep(j, 0, 2) if (c[i][j] == 0) yy = 1;
if (!yy) return f[s][x] = 0; int ff[11];
memset(ff, 0, sizeof ff);
int cnt = 0;
rep(i, 0, 2){
rep(j, 0, 2){
if (c[i][j]) continue;
c[i][j] = x;
int ss = calc(c);
++cnt;
ff[cnt] = solve(ss, 3 - x);
c[i][j] = 0;
}
} int ret0 = 0, ret2 = 0;
rep(i, 1, cnt){
if (ff[i] == 1) ret2 = 1;
else if (ff[i] == 0) ret0 = 1;
} if (ret2) return f[s][x] = 2;
else if (ret0) return f[s][x] = 0;
else return f[s][x] = 1;
} void init(){
rep(i, 0, 2){
rep(j, 0, 2){
scanf("%s", ch);
if (ch[0] == '.') a[i][j] = 0;
else if (ch[0] == 'o') a[i][j] = 1;
else if (ch[0] == 'x') a[i][j] = 2;
}
} scanf("%s", ch);
if (ch[0] == 'o') x = 1;
else x = 2;
s = calc(a);
} int main(){ memset(f, -1, sizeof f); scanf("%d", &T);
while (T--){
init();
ans = solve(s, x);
if (x == 2){
if (ans == 2) puts("x win!");
else if (ans == 1) puts("o win!");
else puts("tie!");
} else{
if (ans == 2) puts("o win!");
else if (ans == 1) puts("x win!");
else puts("tie!");
}
} return 0;
}
Hrbust 2320 OX (博弈)的更多相关文章
- 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move
poj 1568:Find the Winning Move [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...
- hdu----(1849)Rabbit and Grass(简单的尼姆博弈)
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 5754 Life Winner Bo 组合博弈
Life Winner Bo Problem Description Bo is a "Life Winner".He likes playing chessboard gam ...
- HDU 2509 Nim博弈变形
1.HDU 2509 2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...
- HDU 1907 Nim博弈变形
1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...
- 51nod1072(wythoff 博弈)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1072 题意: 中文题诶~ 思路: 博弈套路是有的, 找np局 ...
- ACM: NBUT 1107 盒子游戏 - 简单博弈
NBUT 1107 盒子游戏 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format: Practice Appoint ...
- 【转】ACM博弈知识汇总
博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍 ...
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
随机推荐
- Java基础知识:Collection接口
*本文是最近学习到的知识的记录以及分享,算不上原创. *参考文献见文末. 这篇文章主要讲的是java的Collection接口派生的两个子接口List和Set. 目录 Collection框架 Lis ...
- input type=file输入框
<div class="row"> <!--选择图片按钮--> <div class="col-xs-12" align=&quo ...
- winform中使用webBrowser时如何与JS交互
最近写一个GEPlugin项目,要用到geWebBrowser与JS进行交互. 这个geWebBrowser的事件 private void geWebBrowser1_DocumentComplet ...
- 洛谷P1162 填涂颜色
题目链接:https://www.luogu.org/problemnew/show/P1162 这道题是LITTLESUN写的第一道BFS哦! 对于这道题的的思路是把封闭图形外边的0标记一边,在最后 ...
- ActiveMQ初步学习
本文主要参考张丰哲大神的简书文章,链接 https://www.jianshu.com/p/ecdc6eab554c JMS,即Java Message Service,通过面向消息中间件(MOM:M ...
- flex布局之flex-grow和flex-shrink如何计算
此文已由作者张含会授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 关于盒模型布局 如何实现两栏布局? (表格) 流式, 浮动, 定位 如何选择? 流式 > 浮动 > ...
- c++ 吕凤翥 第五章 类对象一
一 类的声明和实现 1. class tdate //声明部分 { public: void setdate(int y,int m,int d); int isleapyear(); voi ...
- [python工具][pycharm]pycharm licence activation失效的解决方法
推荐网站: http://idea.lanyus.com/ 1 请将“0.0.0.0 account.jetbrains.com”添加到C:\Windows\System32\Drivers\etc\ ...
- Solr linux安装
1.下载安装(自行官网下载) 2.解压安装包 3.进入解压后的bin目录执行命令: ./solr start 出现如下警告: 根据提示修改solr.in.sh中的SOLR_ULIMIT_CHECKS属 ...
- ibatis selectKey
<insert id="insert" parameterClass="A"> <selectKey keyProperty="uu ...