http://poj.org/problem?id=1568 (题目链接)

题意

  两人下4*4的井字棋,给出一个残局,问是否有先手必胜策略。

Solution

  极大极小搜索。。

  这里有个强力优化,若已经被下了的的格子数cnt小于等于4的话,那么一定是平局至于为什么,自己YY一下发现好像是这样的。。

代码

// poj1568
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#define MOD 100003
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std; char s[4][4];
int a[4][4],cnt; int check(int f,int &X,int &Y) {
for (int i=0;i<4;i++) {
int ff=0;
for (int j=0;j<4;j++) if (a[i][j]==f) ff++;
//if (ff==3) for (int j=0;j<4;j++) if (!a[i][j]) {X=i,Y=j;return 1;}
if (ff==4) return 1;
}
for (int j=0;j<4;j++) {
int ff=0;
for (int i=0;i<4;i++) if (a[i][j]==f) ff++;
//if (ff==3) for (int i=0;i<4;i++) if (!a[i][j]) {X=i,Y=j;return 1;}
if (ff==4) return 1;
}
int ff=0;
for (int i=0;i<4;i++) if (a[i][i]==f) ff++;
//if (ff==3) for (int i=0;i<4;i++) if (!a[i][i]) {X=i,Y=i;return 1;}
if (ff==4) return 1;
ff=0;
for (int i=0;i<4;i++) if (a[i][4-i-1]==f) ff++;
//if (ff==3) for (int i=0;i<4;i++) if (!a[i][4-i-1]) {X=i,Y=4-i-1;return 1;}
if (ff==4) return 1;
return 0;
}
int maxdfs(int beta,int &X,int &Y);
int mindfs(int alpha,int &X,int &Y) {
if (cnt==16) return 0;
int x,y,tmp=inf;
int f=check(1,X,Y);
if (f==1) return inf;
for (int i=0;i<4;i++)
for (int j=0;j<4;j++) if (!a[i][j]) {
X=i,Y=j;a[i][j]=2;cnt++;
tmp=min(tmp,maxdfs(tmp,x,y));
a[i][j]=0;cnt--;
if (tmp<=alpha) return tmp;
}
return tmp;
}
int maxdfs(int beta,int &X,int &Y) {
if (cnt==16) return 0;
int x,y,tmp=-inf;
int f=check(2,X,Y);
if (f==1) return -inf;
for (int i=0;i<4;i++)
for (int j=0;j<4;j++) if (!a[i][j]) {
X=i,Y=j;a[i][j]=1;cnt++;
tmp=max(tmp,mindfs(tmp,x,y));
a[i][j]=0;cnt--;
if (tmp>=beta) return tmp;
}
return tmp;
}
int main() {
while (scanf("%s",s[0]) && s[0][0]!='$') {
cnt=0;
for (int i=0;i<4;i++) scanf("%s",s[i]);
for (int i=0;i<4;i++)
for (int j=0;j<4;j++) {
if (s[i][j]=='.') a[i][j]=0;
else if (s[i][j]=='x') a[i][j]=1;
else if (s[i][j]=='o') a[i][j]=2;
if (s[i][j]!='.') cnt++;
}
if (cnt<=4) {printf("#####\n");continue;} //蜜汁优化
int X,Y;
int res=maxdfs(inf,X,Y);
if (res==inf) printf("(%d,%d)\n",X,Y);
else printf("#####\n");
}
return 0;
}

  

【poj1568】 Find the Winning Move的更多相关文章

  1. 【POJ1568】【极大极小搜索+alpha-beta剪枝】Find the Winning Move

    Description 4x4 tic-tac-toe is played on a board with four rows (numbered 0 to 3 from top to bottom) ...

  2. 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move

    poj  1568:Find the Winning Move   [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...

  3. 【CF653G】Move by Prime 组合数

    [CF653G]Move by Prime 题意:给你一个长度为n的数列$a_i$,你可以进行任意次操作:将其中一个数乘上或者除以一个质数.使得最终所有数相同,并使得操作数尽可能小.现在我们想要知道$ ...

  4. 283. Move Zeroes【easy】

    283. Move Zeroes[easy] Given an array nums, write a function to move all 0's to the end of it while ...

  5. poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]

    Find the Winning Move Time Limit: 3000MS   Memory Limit: 32768K Total Submissions: 1286   Accepted:  ...

  6. 【习题 8-4 UVA - 11491】Erasing and Winning

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑删掉第i位. 则第i+1位就会取代第i位. 则肯定第i+1位比第i位大的话,才比较好. 则从小到大贪心删,找到第一个a[i+1] ...

  7. 【POJ1082】Calendar Game (博弈)

    [题目] Description Adam and Eve enter this year's ACM International Collegiate Programming Contest. La ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. 【数据库】_由2000W多条开房数据引发的思考、实践----给在校生的一个真实【练耙场】,同学们,来开始一次伟大的尝试吧。

      ×   缘起---闲逛博客园 前几天的时候,在某一QQ群看到一条消息“XXX酒店开房XXXBTXX迅雷BT下载”,当时是一目十行的心态浏览,目光掠过时, 第一反应我想多了~以为是XX种子(你懂的~ ...

随机推荐

  1. 窗口 - dialog - 概述与基本使用

    什么是dialog 对话框是一种特殊的窗口,它在顶部有一个工具栏,在底部有一个按钮栏.默认情况下,对话框(dialog)只有一个显示在头部右侧的关闭工具. 用户可以配置对话框行为来显示其他工具(比如: ...

  2. 快速排名 让人疯狂的黑帽seo技术

    对于黑帽seo大家或许并不陌生,黑帽seo和白帽seo恰恰相反,是作弊手段.有白帽seo的时候,就有了黑帽seo一直到现在.但隔行如隔山这句话这句话一点都没错,再没接触黑帽seo技术之前我根本不知道黑 ...

  3. Swagger 增加 DocumentFilter 隐藏不需要显示的接口

    services.ConfigureSwaggerGen(options => { options.SingleApiVersion(new Info { Version = "v1& ...

  4. SharePoint 2013无代码实现列表视图的时间段动态筛选

    本文介绍两种为列表视图设置时间段筛选器的方法.其中,第一个方法用于SharePoint Server,第二个方法同时还能用于SharePoint Foundation. 方法一:日期筛选器Web部件 ...

  5. shell 脚本替换文件中某个字符串

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  6. angular animate

    angular animate 有3种:1,css transition. 2,css keyframe. 3,javascript 用jquery的animate方法: 1,2 两种是纯粹css的, ...

  7. Castle 多继承选择

    Castle 多继承选择 很多时候,我们定义了一个接口,但是这个接口会有多种不同的,这时IOC构造函数注入的时候,就需要自动选择对应的实现. public interface ITestService ...

  8. C#操作Excel时的格式设定(转)

    Excel报表打印的格式设定 1.     表头的设置 Excel._Worksheet myWorksheet; myWorksheet.PageSetup.Orientation = Excel. ...

  9. 【BZOJ1002】【FJOI2007】轮状病毒(生成树计数)

    1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1766  Solved: 946[Submit][Status ...

  10. AngularJS引入Echarts的Demo

    最近要用到图表展示,想了想,还是首选Echarts,HighCharts和D3.js备用吧, 而项目中也用到了AngularJS,所以需要把Echarts引入到AngularJs中一起使用, 试了试, ...