【胡搞的不能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 ...
随机推荐
- ipad 如何 Airplay 到 Windows 上?
最近刚好有用到这个,觉得还不错,就推荐给大家.虽然个人并不喜欢苹果这一套,但是工作里难免掺杂一些会用到的ipad , mac . 纯粹技术分享. 1. 5KPlayer : https://www.5 ...
- 学习笔记:oracle学习三:SQL语言基础之sql语言简介、用户模式
目录 1.sql语言简介 1.1 sql语言特点 1.2 sql语言分类 1.3 sql语言的编写规则 2.用户模式 2.1 模式与模式对象 2.2 实例模式scott 本系列是作为学习笔记,用于记录 ...
- springboot的propteis的基本配置参考
其中mybatis.cfg.xml文件可以不加,这个文件最主要是开启mybatis的二级缓存:
- MongoDB 空间定位(点) 与 距离检索
转自: http://blog.csdn.net/flamingsky007/article/details/39208837 基于 MongoDB 2.6 GeoJSON 格式 { "ty ...
- Ctex ERROR Reading
提供一个"Ctex ERROR Reading"的处理办法 方法/步骤: 1. 再我们打开一些网上下载的文档的时候可能出现错误提示 2. 这种问题一般是文件编码的问题,我们需要选择 ...
- Redis--set类型操作命令
集合类型 set redis 的 Set 是 string 类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数据 集合类型 set ——常用命令 sadd /smembers /sismemb ...
- uwsgi flask gevent 测试代码覆盖率(coverage)
目录 可能出现的问题 解决 可能出现的问题 多进程启动 gevent启动 运行的服务可能不会停止 解决 我先参考了一下这一篇文章使用Coverage分析WSGI项目的代码覆盖率,他基本能够解决掉1.2 ...
- Scratch编程:初识Scratch及编程工具安装(一)
“ Scratch是一款由美国麻省理工学院(MIT)设计开发的少儿编程工具.” Scratch采用可视化.模块化的编程方式,非常适合青少年作为初次接触编程的工具和语言来学习,进而用其编写充满趣味的小程 ...
- Hibernate定义
Hibernate:(Object Relational Mapping)对象关系映射 对象关系映射就是在操作数据库之前,先将数据库的表和实体类关联起来,通过实体类的对象,就可以操作数据库,开发人 ...
- 关于window.location.hash的理解及其应用(转)
原文1:https://blog.csdn.net/zhuchuji/article/details/50736360 原文2(window.location.href和window.location ...