【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种子(你懂的~ ...
随机推荐
- Pycharm: keyboard reference
Source: Official set ♥ Editing Ctrl + Space Basic code completion (the name of any class, method or ...
- P3381 【模板】最小费用最大流
P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...
- 黑暗圣经---物业公司CTO/CEO改如何给老板推荐物业信息化产品
多年前一次偶然的机会进入到物业信息化行业,在这个过程中认识很多奋战在物业一线的技术大牛.很多时候都会介绍一些朋友给我认识一下,帮我推荐一下我们闻风多奇的物业管理平台.很多朋友看完我们的系统之后都会很开 ...
- grains
用途 1,匹配客户端 2,配置文件里使用 3,资产管理 定义grains方法1: 方法2:
- Mysql的操作说明
Mysql对于用户的操作权限的控制都在:mysql.user表中 User字段:表示用户名称: Host字段:表示允许该用户访问的地址,可以是域名(如localhost).主机名.ip和%:%表示不限 ...
- 开发备忘:AngularJS Syntax error, unrecognized expression in template file
在写基于Angular的项目过程中,运行 grunt test的时候,一直给我蹦出这个错误,导致我的test一直跑不过,怎么试都是失败,经过重复排查,发现是因为template file中的html元 ...
- 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...
- lecture7-序列模型及递归神经网络RNN
Hinton 第七课 .这里先说下RNN有recurrent neural network 和 recursive neural network两种,是不一样的,前者指的是一种人工神经网络,后者指的是 ...
- 迭代和递归 - leetcode 206. Reverse Linked List
Reverse Linked List,一道有趣的题目.给你一个链表,输出反向链表.因为我用的是JavaScript提交,所以链表的每个节点都是一个对象.例如1->2->3,就要得到3-& ...
- [转]Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
'dmesg'命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构.cpu.挂载的硬件,RAM等多个运行级别的大量的系统信息.当计算机启动时,系统内核(操作系统的核心部分)将会被加载到 ...