题目链接:OX

题意 :给出一个3X3的黑白棋棋盘,棋盘上有若干黑白子,再给出下一个下的人,问下一个下的人能否赢

分析:考虑到只有39种状态,故用一个数保存目前棋盘的状态,记为value,再枚举空位DFS,每次

DFS先判该状态是否已到达(剪枝),再拆分状态用c[3][3]储存,判断是否有赢的状态,最后遍历

棋盘寻找空位,若有则下,value储存状态,再DFS下去,注意返回c[i][j]清零

判断胜负平的条件如下:

  若有一个状态可以到达必败点,则该点必胜,返回1

  若有一个状态可以到达平局点,则该点平局,返回-1

  否则必败,返回0

详情见代码

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+;
int t,dp[maxn][],st;
char s[]; int dfs(int value,int st)
{
if(dp[value][st]!=-) return dp[value][st];
int c[][],sum=,n1=,n2=;//memset(c,0,sizeof(c));
for(int i=;i<;++i)for(int j=;j<;++j)
{
c[i][j]=value%;value/=;
if(c[i][j]) sum++;
}
for(int i=;i<;++i)
{
if(c[i][]==c[i][]&&c[i][]==c[i][]) if(c[i][]==) n1=;else if(c[i][]==) n2=;
if(c[][i]==c[][i]&&c[][i]==c[][i]) if(c[][i]==) n1=;else if(c[][i]==) n2=;
}
if(c[][]==c[][]&&c[][]==c[][]) if(c[][]==) n1=;else if(c[][]==) n2=;
if(c[][]==c[][]&&c[][]==c[][]) if(c[][]==) n1=;else if(c[][]==) n2=;
if(n1&&st==) return ;
if(n2&&st==) return ;
if(n1&&st==) return ;
if(n2&&st==) return ;
if(sum==) return -;
int judge=;
for(int i=;i<;++i)for(int j=;j<;++j) if(c[i][j]) continue;
else
{
int value=;
c[i][j]=st;
for(int p=;p<;++p)for(int k=;k<;++k) value=value*+c[p][k];
c[i][j]=;//很重要,返回时清0
int ans=dfs(value,-st);
if(ans==) return ;//可以到达必败点的为必胜点
if(ans==-) judge=;//可以到达平局的状态返回平局
}
if(judge) return -;else return ;//否则返回必败点
}
int main()
{
for(scanf("%d",&t);t--;)
{
for(int i=;i<maxn;++i)for(int j=;j<;++j) dp[i][j]=-;
int value=;
for(int i=;i<;++i)for(int j=;j<;++j)
{
scanf("%s",s);
if(s[]=='o') value=value*+;
else if(s[]=='x') value=value*+;
else value=value*;
}
scanf("%s",s);
if(s[]=='x') st=;else st=;
int ans=dfs(value,st);
if(ans==) printf("%c win!\n",st==?'o':'x');
else if(ans==) printf("%c win!\n",st==?'o':'x');
else puts("tie!");
}
}

哈理工OJ P2320:OX的更多相关文章

  1. 二叉树的建立与遍历(山东理工OJ)

    题目描写叙述 已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(当中逗号表示空节点).请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度. 输入 输入一个长度 ...

  2. 众数问题(山东理工OJ)

    题目描写叙述 给定含有n个元素的多重集合S,每一个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数. 比如,S={1,2,2,2,3.5}.多重集S的众数是2,其重数为3. 对于 ...

  3. 哈理工 oj 2122 旅行(map + 最短路dij算法)

    旅行 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 18(6 users) Total Accepted: 3(3 users) Ra ...

  4. 南洋理工 OJ 115 城市平乱 dijstra算法

    城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...

  5. 南阳理工OJ 15 括号匹配

    思路:动态规划,设dp[i][j]表示第i个字符到第j个字符所需要的最少匹配数,则:(1),如果从第i到j-1个字符中没有一个与第j个字符匹配,那么状态转移方程为 dp[i][j] = dp[i][j ...

  6. 哈理工OJ 1328

    感觉其实可以不水的. //好像是一道特别水的小学数学题.但是我确实看了很久有试了几个样例才懂得.T_T // 先判断是不是素数.如果是素数的话.An-1一定不等于An.否则的话. // 继续找如果有一 ...

  7. 各种OJ网站汇总

    acmicpc.info acmicpc.info http://acmicpc.info/archives/224 此网站聚合了各种ICPC相关信息. 国内Online Judge 用户体验极佳的v ...

  8. 关于Blog使用

    1.网易博客http://inowtofuture.blog.163.com/blog/#m=0 使用时间:2011年8月-2012年2月 记录内容:主要记录本科參加ACM期间在POJ(北京大学OJ) ...

  9. 关于一个.2lf和.2f的战争!(貌似书上错了,静待打脸。)

    在山东理工oj上做题,谈到了输入数据... double i: scanf(“%lf”,&i): 谨记呀,lf时,可以输入任何类型的数据,而.2f,只能输入符合其规格的数据. 再谈输出,dou ...

随机推荐

  1. Codeforces 513G1 513G2 Inversions problem [概率dp]

    转自九野:http://blog.csdn.net/qq574857122/article/details/43643135 题目链接:点击打开链接 题意: 给定n ,k 下面n个数表示有一个n的排列 ...

  2. 牛客网 牛客网暑期ACM多校训练营(第三场)E KMP

    链接:https://www.nowcoder.com/acm/contest/141/E 题目描述 Eddy likes to play with string which is a sequenc ...

  3. SOJ 4482 忽悠大神【最小生成树】

    题目链接: http://acm.scu.edu.cn/soj/problem.action?id=4482 题意: 给定边权和点权,从一个点出发并回到该点,减少尽量多的边,每路过点和边都要把权重加到 ...

  4. 分享一下然让显卡满血复活的小技巧(GTX)

    分享一下然让显卡满血复活的小技巧 笔者在玩大型游戏卡顿15fps下载如下操作 GTX950玩大型游戏都不会卡帧率稳定在30fps 下载GeForce Experience下载更新最新驱动 下载如下程序 ...

  5. Atom安装代码格式化插件atom-beautify

    官网:https://github.com/Glavin001/atom-beautify 效果: 使用: [cmd]-[shift]-[p]或者[ctrl]-[shift]-[p]

  6. SeaGlass:手工搭建伪基站监控系统

    “伪基站”即假基站,设备一般由主机和笔记本电脑或手机组成,通过短信群发器.短信发信机等相关设备能够搜取以其为中心.一定半径范围内的手机卡信息,利用2G移动通信的缺陷,通过伪装成运营商的基站,冒用他人手 ...

  7. Office EXCEL 中如何让一个单元格的数据链接到另一个工作表的数据

    比如我在Sheet2中定义了几个数据,这些都是简单的数字,而在Sheet1中让要被绑定的单元格等于Sheet2的对应单元格地址(比如Sheet2!B1,Sheet2!B2之类的)   然后就可以一改全 ...

  8. cocos2dx 制作单机麻将(五)

    cocos2dx 制作单机麻将(五) 麻将逻辑6 最基础的4人麻将逻辑(轮流循环出牌, 之前学的都能用上  跑起来了!!!) 最基础的麻将逻辑 依据自己须要 设置麻将人数GAME_PLAYER 基本流 ...

  9. Java基础实例

    打印等腰三角形代码 public class ForForTest{ public static void main(String []args){ for(int x=0;x<5;x++){ ...

  10. ubuntu下安装pycharm的方法

    linux下安装pycharm是比较麻烦的. 安装pycharm之前要安装好JDK8,依次执行如下的命令: sudo add-apt-repository ppa:webupd8team/java s ...