【胡搞的不能AC的题解,暴力搜索一发博弈问题】1995 三子棋 - 51Nod
小的时候大家一定玩过“井”字棋吧。也就是在九宫格中,只要任意行、列,或者任意连续对角线上面出现三个相同的,就能获胜。现在小明和小花也在玩三子棋,但是他们不是在九宫格里,而是在3×4的格子里面。现在小明先下,但是他知道小花这个人很聪明,他想知道第一步下在哪一个地方最合适,你能帮帮他吗?
第一行输入一个整数T,表示数据组数(1<T<10000);
第二行输入两个整数x,y,表示3×4格子里面的一个坐标(x,y)(1<=x<=3,1<=y<=4);
每组数据输出最后小明输赢的结果,如果小明一定能赢,第一行输出“Win”,第二行输出小明所需要花的最少步数;如果小明跟小花只能打成平手,第一行输出“Equal”,第二行输出数字0;如果小明不能赢也不能跟小花打成平手,第一行输出“Lose”,第二行输出小花赢小明所需要花的最少步数。
2
2 1
2 4
Equal
0
Equal
0 -------------------------------------------------------------------------------
看到这个题目我想到了搜索,但计算了一下时间复杂度:不是很大,应该不会超时!但是,这是个博弈问题,暴力穷举的话没法进行模拟!
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define emin 1e-10
#define ll long long //10:19--
int mp[][],flag;
int dir[][]= { {,},{,-},{,},{,-},{,},{-,-},{-,},{-,} }; int check()
{
int i,j;
for(j=; j<=; j++) //竖行
{
if(mp[][j]==mp[][j]&&mp[][j]==mp[][j]&&mp[][j]!=-)
return mp[][j];
}
for(i=; i<=; i++) //横行
{
if(mp[i][]==mp[i][]&&mp[i][]==mp[i][]&&mp[i][]!=-)
return mp[i][];
if(mp[i][]==mp[i][]&&mp[i][]==mp[i][]&&mp[i][]!=-)
return mp[i][];
}
if(mp[][]==mp[][]&&mp[][]==mp[][]&&mp[][]!=-)
return mp[][];
if(mp[][]==mp[][]&&mp[][]==mp[][]&&mp[][]!=-)
return mp[][];
if(mp[][]==mp[][]&&mp[][]==mp[][]&&mp[][]!=-)
return mp[][];
if(mp[][]==mp[][]&&mp[][]==mp[][]&&mp[][]!=-)
return mp[][];
return -; //当前局面无结果
}
void print_mp()
{
for(int i=; i<=; i++)
{
for(int j=; j<=; j++)
printf("%3d",mp[i][j]);
printf("\n");
}
}
//num=0表示先手下棋者,num=1表示后手下棋者
int game(int step,int num) //当前正要走的的步数step,num表示当前step步下棋者
{
int i,j,k;
if(step==) //至多12个格子
return -;
if(k=check(),k!=-) //不用下棋时就已经达到获胜或者失败的局面了!
{
return k;
}
for(i=; i<=; i++)
{
for(j=; j<=; j++)
{
if(mp[i][j]==-)
{
mp[i][j]=num; if(check()==num) //下完一步后,检验整个棋盘可以获胜则返回
{
mp[i][j]=-;
return num; //返回当前局面的获胜者
}
if(game(step+,!num)==num) //后续递归博弈处理可以胜利则返回
{
mp[i][j]=-;
return num; //返回当前局面的获胜者
}
mp[i][j]=-;
}
}
}
return !num;
} int main()
{
int a,b,ans;
// init();
for(a=; a<=; a++)
{
for(b=; b<=; b++)
{
memset(mp,-,sizeof(mp));
mp[a][b]=;//先手先下一步
ans=game(,); //调用博弈函数
if(ans==)
printf("当a=%d,b=%d, 先手Win\n",a,b);
else
printf("当a=%d,b=%d, 先手Lose 或者 Equal\n",a,b);
}
} return ;
}
友情提示这不是题解!没法判断是否可以达到平局的局面,但这题不存在平局的局面;想判断的话,可以用调用game函数的次数来判断!(可能吧!)
像这类博弈问题基本都是找规律的,找不出来规律就没法了!除非很水的题!
【胡搞的不能AC的题解,暴力搜索一发博弈问题】1995 三子棋 - 51Nod的更多相关文章
- 胡搞-强化版的light oj-1055-的思路-AI版的6重暴力For循环的BFS
新题目大意: 三个棋子按照先后顺序,可以随意方向合法地走到空位置上(而不是像原题light oj-1055中的一样三个棋子每次走的方向都一致),当三个棋子全部走进目标地点,就结束:求需要指挥的最少次数 ...
- [LeetCode]Integer Break(Dp或胡搞或推公式)
343. Integer Break Given a positive integer n, break it into the sum of at least two positive intege ...
- HDU 4690 EBCDIC (2013多校 1005题 胡搞题)
EBCDIC Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total Su ...
- ACM 暴力搜索题 题目整理
UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vec ...
- hdu 4740 The Donkey of Gui Zhou(暴力搜索)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...
- HDU 3131 One…Two…Five! (暴力搜索)
题目链接:pid=3131">HDU 3131 One-Two-Five! (暴力搜索) 题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6= ...
- POJ 1129:Channel Allocation 四色定理+暴力搜索
Channel Allocation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13357 Accepted: 68 ...
- 牛客练习赛24题解(搜索,DP)
A题,C题不讲,基础题(但是我要抨击一下这次比赛,卡cin,cout,卡的太狠了,根本就不让过的那种,QAQ) 链接:https://www.nowcoder.com/acm/contest/157/ ...
- hdu 1427 速算24点 dfs暴力搜索
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem De ...
随机推荐
- mysql子查询用法
mysql子查询用法 1 可以当值来用<pre>select id from hcyuyin_share where id=(select id from hcyuyin_share li ...
- linux软件安装习惯
Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./u ...
- PHP正则匹配价格
/** * 匹配价格 * @param $price * @return bool */ public static function checkPrice($price) { // 不能小于0 if ...
- crontab每小时运行一次
先给出crontab的语法格式 对于网上很多给出的每小时定时任务写法,可以说绝大多数都是错误的!比如对于下面的这种写法: 00 * * * * #每隔一小时执行一次 00 */1 * * * #与上面 ...
- as报错 Multiple root tags Unexpected tokens 这个都是编译器识别问题
从网上复制了个代码,直接复制上,结果一篇红线提示Unexpected tokens 通过去掉空格,还是无法根治,别的地方复制的就没有问题. 通过查看复制的网页源码 可以看到里边<> 这个符 ...
- Java的设计模式(7)— 生产者-消费者模式
生产者-消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案.这个模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程.生产者线程负责提交用户请求,消费者线程则负责具体 ...
- 1.http 协议和 https 协议的原理
首先,我们得知道应用层是 OSI 七层网络模型的第七层,不同类型的网络应用有不同的通信规则,因此应用层协议是多种多样的,比如 DNS.FTP.Telnet.SMTP.HTTP. 等协议都是用于解决其各 ...
- 面向对象分析与设计—OOA部分
第二部分 面向对象分析 2.1 面向对象分析(OOA)的定义? OOA——面向对象的分析,就是运用面向对象方法进行系统分析,对问题域(问题所涉及的范围)和系统责任(所开发的系统应具备的职能)进行分析与 ...
- EXCEL 快捷键大全
1.ctrl+tab :快速切换已打开的excel/ppt/word同样适用 2.shift+右上角的× :关闭所有excel/ppt/word 3.ctrl+d:快速复制非文本目标,对于文本是删除 ...
- java使用poi操作word, 支持动态的行(一个占位符插入多条)和表格中动态行, 支持图片
依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifa ...