题目链接: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. xhprof安装&&使用[转载]

    编译安装 wget http://pecl.php.net/get/xhprof-0.9.2.tgz tar zxf xhprof-0.9.2.tgz cd xhprof-0.9.2/extensio ...

  2. python学习之-- subprocess模块

    subprocess 模块 功能:用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值.它用来代替多个旧模块和函数: os.system os.spawn* os.popen ...

  3. CodeForces 592D Super M

    先把没用的边去掉,求出包含m个点的最小树.然后求出最小树的直径就可以得到答案了. #include <cstdio> #include <cstring> #include & ...

  4. CF821E(多次矩阵快速幂)

    题意: 冈伦从二维平面上(0,0)走到(k,0),(k<=1e18),每次有三个行动方向:右上一格.右方一格.右下一格,问一共有多少种走的方案 限制:每段x都有一个天花板,一共有n段天花板(n& ...

  5. sklearn特征工程总结

    转自: http://www.cnblogs.com/jasonfreak/p/5448385.html https://www.zhihu.com/question/28641663/answer/ ...

  6. UILable怎样加入单击事件

    //初始化UILable UILabel *lable = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, 320, 40)]; //设置其能够接收用 ...

  7. easyUI 验证控件应用、自己定义、扩展验证 手机号码或电话话码格式

    easyUI 验证控件应用.自己定义.扩展验证 手机号码或电话话码格式 在API中   发现给的demo 中没有这个验证,所以就研究了下. 相关介绍省略,直接上代码吧! watermark/2/tex ...

  8. LoadRunner系列实例之— 01录制cas登陆脚本

    关于CAS 的概念,见链接 需要增加4个关联函数,初次加载页面时取cookie和it1,输入账号密码点击登录时,取ticketGrantingTicketId和it2 实际上前后台完成两次交互, // ...

  9. 三. 200多万元得到的创业教训--创业并不须要app

    摘要:有个点子,研发app或站点,推广,不断改进,探索盈利模式.这个通用的移动互联网创业流程.但我觉得.在某些特定的商业模式下,"研发app或站点"这步能够砍掉或推迟. 健生干货分 ...

  10. C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包括鼠标指针形状

    本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ...