哈理工OJ P2320:OX
题目链接: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的更多相关文章
- 二叉树的建立与遍历(山东理工OJ)
题目描写叙述 已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(当中逗号表示空节点).请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度. 输入 输入一个长度 ...
- 众数问题(山东理工OJ)
题目描写叙述 给定含有n个元素的多重集合S,每一个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数. 比如,S={1,2,2,2,3.5}.多重集S的众数是2,其重数为3. 对于 ...
- 哈理工 oj 2122 旅行(map + 最短路dij算法)
旅行 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 18(6 users) Total Accepted: 3(3 users) Ra ...
- 南洋理工 OJ 115 城市平乱 dijstra算法
城市平乱 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安,这M个城市 ...
- 南阳理工OJ 15 括号匹配
思路:动态规划,设dp[i][j]表示第i个字符到第j个字符所需要的最少匹配数,则:(1),如果从第i到j-1个字符中没有一个与第j个字符匹配,那么状态转移方程为 dp[i][j] = dp[i][j ...
- 哈理工OJ 1328
感觉其实可以不水的. //好像是一道特别水的小学数学题.但是我确实看了很久有试了几个样例才懂得.T_T // 先判断是不是素数.如果是素数的话.An-1一定不等于An.否则的话. // 继续找如果有一 ...
- 各种OJ网站汇总
acmicpc.info acmicpc.info http://acmicpc.info/archives/224 此网站聚合了各种ICPC相关信息. 国内Online Judge 用户体验极佳的v ...
- 关于Blog使用
1.网易博客http://inowtofuture.blog.163.com/blog/#m=0 使用时间:2011年8月-2012年2月 记录内容:主要记录本科參加ACM期间在POJ(北京大学OJ) ...
- 关于一个.2lf和.2f的战争!(貌似书上错了,静待打脸。)
在山东理工oj上做题,谈到了输入数据... double i: scanf(“%lf”,&i): 谨记呀,lf时,可以输入任何类型的数据,而.2f,只能输入符合其规格的数据. 再谈输出,dou ...
随机推荐
- Android基本动画
Android基本动画 Android Animations动画使用详解 一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XM ...
- AS3实现ToolTip效果
AS3核心类中没有ToolTip类,Flex中的ToolTip类没法用在AS3工程中,Aswing的JToolTip不错,不过如果仅仅为了使用这一个类而导入Aswing就不太明智了.由于最近的项目需要 ...
- oc温习二:基本运算及基本运算符
C语言一共有34种运算符,如下: 运算符分类: 1.按照功能划分: (1)算术运算符 + 加法运算符 - 减法运算符 或者负值运算符 * 乘法运算符 / 除法运算符 % 模运算符,或者取余运算符,要求 ...
- c:forEach varStatus 属性
c:forEach varStatus 属性 current: 当前这次迭代的(集合中的)项 index: 当前这次迭代从 0 开始的迭代索引 count: 当前这次迭代从 1 开始的迭代计数 fir ...
- Java日志框架-Logback手册中文版以及官方配置文档教程
Logback手册中文版:(链接: https://pan.baidu.com/s/1bpMyasR 密码: 6u5c),虽然版本有点旧,但是大体意思差不多,先用中文版了解个大概,然后一切最新的配置以 ...
- 在访问RESTful接口时出现:Could not write content: No serializer found for class的问题解决小技巧收集
注意:市面上对于写RESTful是用RestFul,其实是不规范的,标准写法RESTful. 在Java上,处理这个应该是没有继承Serializable类,然后通过Eclipse生成serialVe ...
- JVM监控工具:jps、jstat、jinfo、jmap、jhat、jstack使用介绍
转载:http://outofmemory.cn/java/jvm/jvm-tools-jps-jstat-jinfo-jmap-jhat-jstack 一.jps(JVM Process Statu ...
- [正在学习开发板]分享--- iTOP-4412移植CAN
首先拷贝迅为提供的 libcanjni.tar.gz 压缩包到 android 源代码的"iTop4412_ICS/device/samsung/common"文件夹以下,然后使用 ...
- JNI返回复杂对象之中的一个
需求: 首先说需求.近期接手一个项目.要在底层解析二进制数据,数据结构比較负责,因为server是c++server,加之開始没有考虑到移动端开发,所以协议有点扯蛋.大体是这种,一个数据包里面是map ...
- hdu4737A Bit Fun 线段树
//给一串序列,问有多少对[i,j]使得 //[i,j]区间的全部数的或的值小于m //能够知道'或'操作的加(a|b)>=max(a,b) //能够枚举区间的右边r,找左边第一个不满足的位置 ...