【poj1568】 Find the Winning Move
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的更多相关文章
- 【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) ...
- 【迭代博弈+搜索+剪枝】poj-1568--Find the Winning Move
poj 1568:Find the Winning Move [迭代博弈+搜索+剪枝] 题面省略... Input The input contains one or more test cas ...
- 【CF653G】Move by Prime 组合数
[CF653G]Move by Prime 题意:给你一个长度为n的数列$a_i$,你可以进行任意次操作:将其中一个数乘上或者除以一个质数.使得最终所有数相同,并使得操作数尽可能小.现在我们想要知道$ ...
- 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 ...
- poj1568 Find the Winning Move[极大极小搜索+alpha-beta剪枝]
Find the Winning Move Time Limit: 3000MS Memory Limit: 32768K Total Submissions: 1286 Accepted: ...
- 【习题 8-4 UVA - 11491】Erasing and Winning
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑删掉第i位. 则第i+1位就会取代第i位. 则肯定第i+1位比第i位大的话,才比较好. 则从小到大贪心删,找到第一个a[i+1] ...
- 【POJ1082】Calendar Game (博弈)
[题目] Description Adam and Eve enter this year's ACM International Collegiate Programming Contest. La ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- 【数据库】_由2000W多条开房数据引发的思考、实践----给在校生的一个真实【练耙场】,同学们,来开始一次伟大的尝试吧。
× 缘起---闲逛博客园 前几天的时候,在某一QQ群看到一条消息“XXX酒店开房XXXBTXX迅雷BT下载”,当时是一目十行的心态浏览,目光掠过时, 第一反应我想多了~以为是XX种子(你懂的~ ...
随机推荐
- 043医疗项目-模块四:采购单模块—采购单明细查询(Dao,Service,Action三层)
前一篇文章我们做的是在医院的角度上添加在采购单里面添加药品.这一篇文章是查看我们添加的采购单信息. 我们先看一下要实现的效果:当: 按下确认添加时,会在这里 显示出刚才添加的数据. 好,我们就来做这个 ...
- 032医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------Service层和Action层和调试
我们上一篇文章讲了Dao层代码: 这一篇我们讲解Service层和Action层: Service层: 分为接口和实现类,我们主要看实现类:GysemplServiceImpl package yyc ...
- VS2010/VS2013怎么复制项目/拷贝项目/克隆项目
本文以vs2013为例,讲述了如何复制项目.vs2008,vs2010,vs2012等版本应操作类似 vs中的项目位于解决方案中,简单的复制粘贴是不能实现项目复制的 一.准备 原项目名称:test 目 ...
- 上传Text文档并转换为PDF(解决乱码)
前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理 ...
- [转]使用URLDecoder和URLEncoder对中文进行处理
一 URLEncoder HTML 格式编码的实用工具类.该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法.有关 HTM ...
- Linux shell中的符号
.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用. 括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空 ...
- 关于onbeforeunload的一些想法
页面在关闭前会有onbeforeUnload事件,来询问用户是否要关闭这个页面OR选项卡 浏览器的F5刷新为按下F5----onbeforeUnload----onunload----onload; ...
- script实现的日期表示
function clockon(bgclock){ var now=new Date(); var year=now.getYear(); var month=now.getMonth(); var ...
- GitHub中国区前100名到底是什么样的人?
本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...
- 浅析WPhone、Android的Back与Home键
浅析WPhone.Android的Back与Home键 背景 本人一直在用诺基亚手机(目前是Nokia 925,Windows Phonre 8.1),在界面设计.应用多样性等方面没少受身边Andro ...