题目链接: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. 10.1——pair,map,set,multimap,multiset

    map和set只允许相同的键出现一次,而multimap和multiset则允许出现多次. 1. 引言——pair类型: pair需要添加头文件utility头文件 make_pair<v1,v ...

  2. Python()- 面向对象三大特性----继承

    继承: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类(基类或超类),新建的类是所继承的类的(派生类或子类) 人类和狗 有相同的属性, 提取了一个__init__方法,在这 ...

  3. I NEED A OFFER!---hdu1203(01背包)

     http://acm.hdu.edu.cn/showproblem.php?pid=1203   Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考 ...

  4. HDU 1558

    输入线段的两个短点,如果线段相交那么他们属于一个集合,查看第i条线段所在的集合有几条线段. 好久没码码了,总是各种蠢. 首先找出两条直线的方程,求解相交点的横坐标,然后看是不是在线段内部. 没有注意题 ...

  5. loj6158 A+B Problem (扩展KMP)

    题目: https://loj.ac/problem/6158 分析: 先把S串逆置,就是从低位向高位看 我们再弄个T串,S串前面有x个连续的0,那么T串前面也有x个连续的0 第x+1位,满足S[x+ ...

  6. SAS学习笔记 - R的数据操作

    1.对象 1.1 对象及其内在属性 R中的处理数据就是对象,每个对象可以包含多个元素.对象有两个内在属性:类型和长度.类型是对象元素的基本种类,共四种:数值型,字符型,复数型和逻辑型.对象的类型和长度 ...

  7. pip命令自动补全功能;设置代理;使用国内源

    这是pip自带的功能 执行的脚本 把脚本写入.zshrc或者profile等里面,执行source立即生效 设置代理: pip --proxy=http://username:password@pro ...

  8. Visual Studio VS如何拷贝一个项目的窗体文件到另一个项目

    1 比如下我有一个项目,我要把这个Config整个窗体和代码拷贝到另一个项目   2 在新项目中添加现有项,然后把这个窗体相关的三个文件都添加到新的项目中   3 然后在新窗体中就什么都有了     ...

  9. angular react vue 浏览器兼容情况汇总

    一.逻辑层 框架 (1)angular Angular早在1.3版本就抛弃了对ie8的支持. (2)react React 早在0.14.x 版本就抛弃了对ie8的支持. (3)vue Vue就没打算 ...

  10. C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

    序列性容器::(vector和list和deque)   erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被   删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...