【胡搞的不能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 You can't specify target table for update in FROM clause解决方法
mysql You can't specify target table for update in FROM clause解决方法出现这个错误的原因是不能在同一个sql语句中,先select同一个表 ...
- Java创建线程的两种方法
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
- Python 机器学习库 NumPy 教程
0 Numpy简单介绍 Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过numpy ...
- Spring @Transactional 事务机制
几个概念要清楚:事务的传播机制,事务的边界 工作原理 运行配置@Transactional注解的测试类的时候,具体会发生如下步骤 1)事务开始时,通过AOP机制,生成一个代理connection对象, ...
- 030 Android 第三方开源下拉框:NiceSpinner的使用+自定义Button样式+shape绘制控件背景图+图片选择器(selector)
1.NiceSpinner下拉框控件介绍 Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框 ...
- [转帖]理解k8s 的 Ingress
理解k8s 的 Ingress https://www.jianshu.com/p/189fab1845c5/ 暴露一个http服务的方式 service 是 k8s 暴露http服务的默认方式, 其 ...
- MappingJackson2JsonView——model转成json
一.ajax请求,返回ModelAndView对象,结果报404: @RequestMapping(value = "/video") public ModelAndView jj ...
- (二)linux 学习 -- 探究操作系统
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap04.html 文章目录 ls 命令进阶 `l ...
- python 并发的开端
目录 网络并发 进程的基础 2.操作系统 操作系统的发展史 多道技术 第二代 1955~1965 磁带存储--批处理系统 第三代集成电路,多道程序系统(1955~1965) 进程的理论(重点) 2.操 ...
- Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)
1. 利用for循环遍历整个列表 magicians = ['alice', 'dsvid', 'carolina'] # 遍历整个列表 for magician in magicians: prin ...