[关键字]:枚举

[题目大意]:给出一盘五子棋局,判断在3步内是否有人能赢。

//=============================================================================================================================

[分析]:首先考虑第一步就有人赢的情况:枚举全棋盘所有可以放子的点判断在此处放一颗子后当前先手是否能赢;第二步才有人赢的情况:当前后手有两处地方可以保证走一步就能赢,因为如果只有一处,先手可以在此放子,但有两处的话先手顾此失彼;第三步才有人赢的情况:比上两种情况稍微复杂,首先如果当前后手有一种必胜情况,则将此处放上自己的子然后等同与判断新棋局两步是否能赢(上面情况二),如果当前后手没有必胜情况怎枚举全盘可以放子的地方放一颗子,在按情况二处理。很简单,注意细节就没问题。

[代码]:

View Code

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;

const int dx[4]={0,1,1,1};const int dy[4]={1,1,0,-1};const char S[][6]={"white","black"};

int N,Sx,Sy;int map[15][15],sum[2];

void Init(){    memset(map,255,sizeof(map));    memset(sum,0,sizeof(sum));for (int i=1;i<=N;i++)    {int x,y,c;        scanf("%d%d%d",&x,&y,&c);        map[x][y]=c;        sum[c]++;    }/*for (int i=0;i<15;i++)    {        for (int j=0;j<15;j++) printf(" %d ",map[i][j]);        printf("\n");    }*/}

bool Cleck(int sx,int sy,int o){for (int i=0;i<4;i++)    {int xx=sx,yy=sy,s1=0;for (int j=0;j<4;j++)        {            xx=xx+dx[i],yy=yy+dy[i];if (xx<0 || xx>=15 || yy<0 || yy>=15 || map[xx][yy]!=o) break;            s1++;        }        xx=sx,yy=sy;for (int j=0;j<4;j++)        {            xx=xx-dx[i],yy=yy-dy[i];if (xx<0 || xx>=15 || yy<0 || yy>=15 || map[xx][yy]!=o) break;            s1++;        }if (s1>=4) return 1;    }return 0;}

void Solve(int o){int tot=0;for (int i=0;i<15;i++)for (int j=0;j<15;j++)if (map[i][j]==-1) if (Cleck(i,j,o)) {printf("Place %s at (%d,%d) to win in 1 move.\n",S[o],i,j);return;}    o=!o,tot=0;for (int i=0;i<15;i++)for (int j=0;j<15;j++)if (map[i][j]==-1)            {if (Cleck(i,j,o)) tot++,Sx=i,Sy=j;if (tot==2) {printf("Lose in 2 moves.\n");return;}            }    o=!o;if (tot==1)    {        tot=0;        map[Sx][Sy]=o;for (int i=0;i<15;i++)for (int j=0;j<15;j++)if (map[i][j]==-1)                {if (Cleck(i,j,o)) tot++;if (tot==2) {printf("Place %s at (%d,%d) to win in 3 moves.\n",S[o],Sx,Sy);return;}                }    }else     {for (int i=0;i<15;i++)for (int j=0;j<15;j++)if (map[i][j]==-1)                {                    map[i][j]=o;                    tot=0;for (int i1=0;i1<15;i1++)for (int j1=0;j1<15;j1++)if (map[i1][j1]==-1)                            {if (Cleck(i1,j1,o)) tot++;if (tot==2) {printf("Place %s at (%d,%d) to win in 3 moves.\n",S[o],i,j);return;}                            }                    map[i][j]=-1;                }    }    printf("Cannot win in 3 moves.\n");}

int main(){    freopen("in.txt","r",stdin);    freopen("out.txt","w",stdout);while (scanf("%d",&N),N)    {        Init();if (sum[1]==sum[0]) Solve(1);else if (sum[1]==sum[0]+1) Solve(0);else printf("Invalid.\n");    }return 0;}

转载于:https://www.cnblogs.com/procedure2012/archive/2012/03/01/2376027.html

[HDU3683 Gomoku]相关推荐

  1. android 五子棋 布局技巧,与电脑对战「五子棋 – Gomoku」难度由浅入深,棋局练习、分析五大能力!(iPhone,Android)...

    这款「五子棋」游戏适合初学者,应该也适合高手无聊时打发打发时间,主要可与电脑对战,而电脑强度共分为9个等级,以初学者或没什么规则概念的人来玩,挑战到Level 5是没问题,Level 6就有点难以突破 ...

  2. HDU 3683 Gomoku

    HDU_3683 这个题目由于情况不多,所以可以直接枚举,只不过枚举的时候需要注意一些细节. 枚举顺序如下: ①判断我们1步是否能赢. ②判断我们2步是否会输.实际上如果第2步会输,那么就相当于在当前 ...

  3. Traditional Gomoku

    学习情报局 technology related support information is as follows: Contact:PU ZEQIANG Phone:+8617364788577 ...

  4. Emacs自带的小游戏

    一.贪吃蛇 M-x snake,游戏界面如下图 二.俄罗斯方块 M-x tetris,游戏界面如下图 三.五子棋 M-x gomoku,游戏界面如下图 四.乒乓球 M-x pong,游戏界面如下图

  5. GitHub上能让你重拾学习热情的AI项目:权游预测/AI作画/与AlphaZero对弈

    你是否觉得入门AI一段时间,更多是跟公式,代码打交道,感到枯燥?快要失去学习动力了?今天带你了解GitHub上都有哪些好玩有价值的项目,一起重拾学习热情吧! <权力的游戏>预测 4月15号 ...

  6. AI表情迁移、电影字幕自动翻译等,原来是这么玩的!

    随着深度学习技术的发展,AI在生活中的很多场景已随处可见.但是对于很多基础薄弱的开发者来说,深度学习并不是十分友好的技术,直接从框架开始入门需要很高的学习时间成本. 为了让大家更快地入门深度学习,百度 ...

  7. Qt 学习笔记(5)绘图 五子棋游戏

    在上一篇博客C++ Qt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋盘,后续会完成五子棋的游戏设计. 1. 棋盘的设计 首先需要绘制棋盘的 ...

  8. 用Python制作五子棋人机对弈(人工智障版和升级AI版)

    智障版截图: 智能版截图: 可能遇到的问题: No module named 'pyqt5'解决办法 智障版源码: 背景: muzm.jpg window.py from PyQt5.QtWidget ...

  9. Emacs自带小游戏

    M-x tetris 俄罗斯方块 M-x gomoku 五子棋游戏 M-x mpuz 填数字游戏 M-x snake 贪吃蛇游戏

  10. 基于α-β剪枝算法的智能五子棋

    一.基本介绍 游戏界面:使用了Java Swing进行开发,如图所示. 游戏步骤: 1. 先设置游戏的参数,可以选择模式(双人.单人.双机),智能(估值函数.估值函数+搜索树),搜索树(层数.每层节点 ...

最新文章

  1. Java Virtual Machine
  2. enumerate()使用
  3. 3090显卡 torch.cuda.is_available()返回false的解决办法
  4. member pm.php,Dedecms 会员中心注入漏洞5
  5. hive外部表/内部表路径知识点
  6. 第七讲:tapestry可预览的模板页
  7. 中专考的计算机一级b有用吗,白城计算机一级B资格证真实可查么
  8. ArcMap没有工具条和菜单栏的解决方法
  9. 微信H5框架:WEUI
  10. goahead(嵌入式Web服务器)之cgi篇
  11. python十人抽奖小程序_利用python编写年会抽奖小程序
  12. 2020 年全球移动 APT事件总结
  13. 概率论与数理统计 | (16) 方差分析与一元线性回归
  14. android hci设备,android-hci相关操作
  15. 智能客服搭建(2) - MRCP Server ASR插件开发
  16. matlab 函数前加,matlab fopen函数的用法在程序前添加代码:addp
  17. python 爬取东方财富股吧论坛个股评论信息
  18. FreeMind介绍
  19. 我们为什么需要DTO(数据传输对象)
  20. 7-13 QQ帐户的申请与登陆

热门文章

  1. pycharm的todo和fixme标记,标志为今后再做和bug点
  2. 【转】VC6.0+icc编译STLPort5.2
  3. Composite UI Application Block(Cab)比较详细的一片文章
  4. sqlmap批量扫描burpsuite拦截的日志记录
  5. Java获取字符串信息
  6. .net中使用TripleDESCryptoServiceProvider进行3DES加密遇到弱密钥的问题
  7. Cron, PAM, OpenDNS 介绍
  8. 如何理解linux的平均负载?
  9. LE SHAN GIANT BUDDHA and LINGYUN TEMPLE
  10. 如何轻松除掉肠道废物