题目链接: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!");
}
}

最新文章

  1. [moka同学笔记]八、Yii2.0课程笔记(魏曦老师教程)[授权]
  2. 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP
  3. 水面波浪形View--第三方开源--WaveView(电量、能量、容量指示)
  4. asp.net 中使用less
  5. shell 脚本执行日志通用模块
  6. Jsp中response对象的所有属性
  7. [LeetCode]题解(python):115-Distinct Subsequences
  8. oracle数据库恢复与备份
  9. 手势(Gesture)的增加和识别
  10. Webdriver之API详解(3)
  11. Puppeteer: 更友好的 Headless Chrome Node API
  12. JetBrains 注册码
  13. 2018牛客网暑期ACM多校训练营(第三场)C Shuffle Cards(可持久化平衡树/splay)
  14. LightOJ 1074 - Extended Traffic 【SPFA】(经典)
  15. [原创]WB Android客户端架构总结:发WB工作队列设计
  16. 使用RStudio调试(debug)基础学习(一)
  17. SVN中英文菜单对照
  18. python--第十二天总结(Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy)
  19. ZedGraph实时曲线实例
  20. soj1049.Mondriaan

热门文章

  1. 修改flex chart中Legend的字体样式
  2. 从 modCount 看 java集合 fail-fast 机制
  3. GreenDao数据库的升级
  4. HOST绑定和VIP映射
  5. Spark SQL数据载入和保存实战
  6. LightRoom操作快捷键
  7. Binder IPC的权限控制
  8. Codeforces Round #253 (Div. 1) A Borya and Hanabi
  9. woodcut
  10. Xsolla和Hi-Rez工作室联手推行SMITE