1995 三子棋
题目来源: syu校赛
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

原题链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1995

小的时候大家一定玩过“井”字棋吧。也就是在九宫格中,只要任意行、列,或者任意连续对角线上面出现三个相同的,就能获胜。现在小明和小花也在玩三子棋,但是他们不是在九宫格里,而是在3×4的格子里面。现在小明先下,但是他知道小花这个人很聪明,他想知道第一步下在哪一个地方最合适,你能帮帮他吗?

Input
第一行输入一个整数T,表示数据组数(1<T<10000);
第二行输入两个整数x,y,表示3×4格子里面的一个坐标(x,y)(1<=x<=3,1<=y<=4);
Output
每组数据输出最后小明输赢的结果,如果小明一定能赢,第一行输出“Win”,第二行输出小明所需要花的最少步数;如果小明跟小花只能打成平手,第一行输出“Equal”,第二行输出数字0;如果小明不能赢也不能跟小花打成平手,第一行输出“Lose”,第二行输出小花赢小明所需要花的最少步数。
Input示例
2
2 1
2 4
Output示例
Equal
0
Equal
0

-------------------------------------------------------------------------------看到这个题目我想到了搜索,但计算了一下时间复杂度:不是很大,应该不会超时!但是,这是个博弈问题,暴力穷举的话没法进行模拟!

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<iostream>
  4 #include<stdlib.h>
  5 #include<math.h>
  6 #include<algorithm>
  7 #include<queue>
  8 using namespace std;
  9 #define inf 0x3f3f3f3f
 10 #define emin 1e-10
 11 #define ll long long   //10:19--
 12 int mp[4][5],flag;
 13 int dir[8][2]= { {0,1},{0,-1},{1,0},{1,-1},{1,1},{-1,-1},{-1,0},{-1,1} };
 14
 15 int check()
 16 {
 17     int i,j;
 18     for(j=1; j<=4; j++) //竖行
 19     {
 20         if(mp[1][j]==mp[2][j]&&mp[2][j]==mp[3][j]&&mp[3][j]!=-1)
 21             return mp[1][j];
 22     }
 23     for(i=1; i<=3; i++) //横行
 24     {
 25         if(mp[i][1]==mp[i][2]&&mp[i][2]==mp[i][3]&&mp[i][3]!=-1)
 26             return mp[i][2];
 27         if(mp[i][2]==mp[i][3]&&mp[i][3]==mp[i][4]&&mp[i][3]!=-1)
 28             return mp[i][2];
 29     }
 30     if(mp[1][1]==mp[2][2]&&mp[2][2]==mp[3][3]&&mp[3][3]!=-1)
 31         return mp[1][1];
 32     if(mp[1][2]==mp[2][3]&&mp[2][3]==mp[3][4]&&mp[3][4]!=-1)
 33         return mp[1][2];
 34     if(mp[1][3]==mp[2][2]&&mp[2][2]==mp[3][1]&&mp[3][1]!=-1)
 35         return mp[1][3];
 36     if(mp[1][4]==mp[2][3]&&mp[2][3]==mp[3][2]&&mp[3][2]!=-1)
 37         return mp[2][3];
 38     return -1; //当前局面无结果
 39 }
 40 void print_mp()
 41 {
 42     for(int i=1; i<=3; i++)
 43     {
 44         for(int j=1; j<=4; j++)
 45             printf("%3d",mp[i][j]);
 46         printf("\n");
 47     }
 48 }
 49             //num=0表示先手下棋者,num=1表示后手下棋者
 50 int game(int step,int num) //当前正要走的的步数step,num表示当前step步下棋者
 51 {
 52     int i,j,k;
 53     if(step==13) //至多12个格子
 54         return -1;
 55     if(k=check(),k!=-1) //不用下棋时就已经达到获胜或者失败的局面了!
 56     {
 57         return k;
 58     }
 59     for(i=1; i<=3; i++)
 60     {
 61         for(j=1; j<=4; j++)
 62         {
 63             if(mp[i][j]==-1)
 64             {
 65                 mp[i][j]=num;
 66
 67                 if(check()==num) //下完一步后,检验整个棋盘可以获胜则返回
 68                 {
 69                     mp[i][j]=-1;
 70                     return num;  //返回当前局面的获胜者
 71                 }
 72                 if(game(step+1,!num)==num) //后续递归博弈处理可以胜利则返回
 73                 {
 74                     mp[i][j]=-1;
 75                     return num;  //返回当前局面的获胜者
 76                 }
 77                 mp[i][j]=-1;
 78             }
 79         }
 80     }
 81     return !num;
 82 }
 83
 84
 85 int main()
 86 {
 87     int a,b,ans;
 88     // init();
 89     for(a=1; a<=3; a++)
 90     {
 91         for(b=1; b<=4; b++)
 92         {
 93             memset(mp,-1,sizeof(mp));
 94             mp[a][b]=0;//先手先下一步
 95             ans=game(2,1);  //调用博弈函数
 96             if(ans==0)
 97                 printf("当a=%d,b=%d, 先手Win\n",a,b);
 98             else
 99                 printf("当a=%d,b=%d, 先手Lose 或者 Equal\n",a,b);
100         }
101     }
102
103     return 0;
104 }

View Code

友情提示这不是题解!没法判断是否可以达到平局的局面,但这题不存在平局的局面;想判断的话,可以用调用game函数的次数来判断!(可能吧!)

像这类博弈问题基本都是找规律的,找不出来规律就没法了!除非很水的题!

转载于:https://www.cnblogs.com/zhazhaacmer/p/8117808.html

【胡搞的不能AC的题解,暴力搜索一发博弈问题】1995 三子棋 - 51Nod相关推荐

  1. Linux作者批评英特尔指令集,Linux之父炮轰英特尔:ECC内存很重要,不好买都怪你胡搞...

    原标题:Linux之父炮轰英特尔:ECC内存很重要,不好买都怪你胡搞 Linux之父炮轰英特尔:ECC内存很重要,不好买都怪你胡搞 原创PCEVA评测室2021-01-06 11:31:08 很多人认 ...

  2. 算法模版:暴力搜索之DFS【沈七】

    本文已收录于专栏 ⭐️ <算法通关笔记>⭐️ 算法模版:暴力搜索之DFS 前言 基本概念 算法思想 常用模板 三种枚举方式 指数型枚举 排列型枚举 组合型枚举 完结散花 题目练习 参考文章 ...

  3. hdu 4740 The Donkey of Gui Zhou(暴力搜索)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4740 [题意]: 森林里有一只驴和一只老虎,驴和老虎互相从来都没有见过,各自自己走过的地方不能走第二次 ...

  4. C++ 暴力搜索String pattern search字符串模式的实现算法(附完整源码)

    C++暴力搜索String pattern search字符串模式的实现算法 C++暴力搜索String pattern search字符串模式的实现算法完整源码(定义,实现,main函数测试) C+ ...

  5. 牛客练习赛24题解(搜索,DP)

    A题,C题不讲,基础题(但是我要抨击一下这次比赛,卡cin,cout,卡的太狠了,根本就不让过的那种,QAQ) 链接:https://www.nowcoder.com/acm/contest/157/ ...

  6. 三子棋の胜负判断(洛谷P1838题题解,Java语言描述)

    题目要求 P1838题目链接 分析 我在想是不是要把这个题再写成扫雷那样的矩阵判断,想换个feel,那就用Set来处理. 众所周知Set有好处,查找快,虽说这只是九宫格三子棋,但contains()就 ...

  7. 搜索 —— 暴力搜索

    [暴力搜索] 暴力搜索,就是将所有情况都举出,并判断其是否符合题目条件.其基本方法是分析题意后,找到一个合适的维度列举每一个元素,以完成题目. 一般主流的 OJ 中,1000ms 的时间限制下可以运行 ...

  8. 2016蓝桥杯C++A组第六题 寒假作业【暴力搜索】

    原题: 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业:□ + □ = □□ - □ = □□ × □ = □□ ÷ □ = □(如果显示不出来,可以参见[图1.jpg])每个方块代表1~13 ...

  9. 【NOIP2002】【Luogu1037】产生数(高精乘低精,DFS暴力搜索)

    problem 给定一个整数n和k个变换规则(一位数可变换成另一个一位数) 经过任意次的变换( 0 次或多次),能产生出多少个不同整数 n < 1e30, k <= 15 例: n=234 ...

最新文章

  1. 降Mail十八章(上)
  2. Linux如何关机与关机命令祥解
  3. js 对象和Json的转换,js及深度复制
  4. consul代理---健康检测
  5. 开源游戏引擎_Hatchit:开源游戏引擎
  6. web在session设置的账户用户名显示为空_海蜘蛛路由Web认证怎么设置 海蜘蛛路由Web认证方法【介绍】...
  7. 应用程序正常初始化(0xc015002)失败解决方法
  8. perl语言书籍教程推荐
  9. eigen 矩阵求逆_「伴随矩阵」Eigen库 矩阵基本操作:转置矩阵,逆矩阵,伴随矩阵,特征值 - seo实验室...
  10. 分槽ALOHA协议仿真
  11. 在excel中如何筛选重复数据_高级筛选,让重复的数据记录无处可逃
  12. git -- git emoji列表(github commit 前面的小icon)
  13. Word控件Spire.Doc 【页面设置】教程(9) 如何在 C# 中添加行号
  14. oracle中的crs,Oracle CRS简介
  15. Wenli Zou's homepage
  16. 专业!“5G消息” VS “微信” 对比研究报告出炉!
  17. 笔记︱金融风险控制基础常识——巴塞尔协议+信用评分卡Fico信用分
  18. 杂记,生源地招生路线规划问题
  19. Mac安装使用eudic欧路词典最新版本-Version 3.9.1 (1032)
  20. 20180130心情总结

热门文章

  1. 帮网管省心省力的koomail公共地址薄
  2. 家族关系查询系统程序设计算法思路_数据结构设计(家族关系查询系统)汇编.doc...
  3. Python 中有 3 个不可思议的返回功能
  4. 多台主机共享一套鼠标键盘(跨屏鼠标键盘)
  5. Erphplogin Pro 连接QQ/微博/微信登录/弹窗登录 WordPress插件
  6. 一个农民工自学java找到工作的励志故事
  7. 读完研继续读博还是先工作几年再读博好一些?
  8. Kubernetes 高可用集群部署
  9. 杨震霆(carboy) -传奇人物
  10. Vuex-状态管理(24)