吴昊品游戏核心算法 Round 5 —— 五子棋(无禁手)后台的判胜负AI(bfs+queue容器)(HDOJ 2699)...
五子棋的历史
连子棋类游戏起源很早,在四千年前的两河文明就有古西亚连棋。
五子棋则咸信是流传于古中国的传统棋种之一,至今仍在民间广泛流传,规则相当简单。或许因没有形成一套独立完整的棋种理论及文化内涵,更无制定公平完善的规则来解决黑白平衡问题,一直没有得到发展,所以没有像围棋、象棋等传统棋类流传广泛,导致缺少可考古的棋具,也没像直棋、方棋等乡土棋类记载在地方县志、古人笔记等文献。
五子棋在传入日本后,被日本人发扬光大,自1899年日本棋士黒岩涙香证明了原始规则的五子棋先下必胜后,五子棋迈入一条不断改良的道路,经过数十年的修改、验证、再修改,最终发展出加入禁手的五子棋,并经过公开征名,称为连珠(RENJU),因此规则在日本成型,又称为日式规则或连珠规则。原始规则在中国依然有人在玩,也被称为无禁规则、自由规则,有软件可验证黑手必胜(这个稍后再证明)。
连珠规则禁止先下的黑棋下出双活三、双四、长连(超过五子以上的连线)下出则判败,此举限制黑棋的取胜方式,白棋则增加逼迫黑子下出禁手来取胜的手 段,使黑棋的优势稍稍减少。不过禁手也许对初学者来说是一种障碍,但下久后会发现,禁手使得双方棋手必需更加精准的掌握棋子的落点,增加了连珠的技术性、 复杂性及趣味性。
又过了几十年,人们发现单单加入禁手,尚无法完全平衡黑棋一子之先的优势,因此在国际比赛使用的“RIF规则”,在连珠规则的基础上,又加入了三手交换及五手两打,算第一个可以真正合乎公平竞技的职业规则。
Problem——该问题,是用一串二维数组装载的字符串,用.表示空,用W表示白棋,用B表示黑棋,来判断目前的局面中的当前走棋的一方是否赢了整盘棋。
Solve:
/*
该程序可以判定当前的一方是否获胜,如果暂时没有获胜或者已经告负,本
程序会有相应的输出。
AI的策略基本上和连连看的相似,也用的是queue容器+BFS
(1)判断当前局势,利用目前棋盘上黑子和白子的数量进行比较
(2)五子连环必须是恰好有五个子,也就是说,沿端点方向上的点应该是空格的
(3)表面上是八个方向,实际上考虑到对称性,四个方向即可
(4)在for循环的条件判断上加上flag,找到一例,即可退出循环
*/
2 #include<queue>//STL里面的queue容器
3 using namespace std;
4
5 struct Node //每个点有一个坐标,最大连通数以及方向
6 {
7 char x,y,time,dirc;
8 bool no_stone;
9 };
10
11 char map[15][15],c;//定义一个二维数组,表示棋盘,c表示现在轮到谁
12
13 int dir[4][2]={{0,1},{1,0},{1,-1},{1,1}};//四个方向
14
15 //BFS搜索,和之前的连连看类似
16 bool bfs(int x,int y)
17 {
18 queue<Node> Q;
19 Node first,next;
20 int i;
21 first.x=x;
22 first.y=y;
23 first.no_stone=false;
24 first.time=1;
25 first.dirc=-1;
26 Q.push(first);
27
28 while(!Q.empty())
29 {
30 first=Q.front();
31 Q.pop();
32 //从第一个点开始,保证有且仅有五个是连在一起的,用no_stone标识没有多连
33 if(first.time==5&&first.no_stone)
34 {
35 return true;
36 }
37 for(i=0;i<4;i++)
38 {
39 //初始方向不确定
40 if(first.dirc==-1||first.dirc==i)
41 {
42 next.x=first.x+dir[i][0];
43 next.y=first.y+dir[i][1];
44 if(next.x>=0&&next.x<15&&next.y>=0&&next.y<15)
45 {
46 next.dirc=i;
47 next.time=first.time+1;
48 //唯独不标识对手的棋子,自己的棋子和空棋子用no_stone区分
49 if(map[next.x][next.y]==c)
50 {
51 next.no_stone=first.no_stone;
52 Q.push(next);
53 }
54 else if(map[next.x][next.y]=='.'&&!first.no_stone)
55 {
56 next.no_stone=true;
57 Q.push(next);
58 }
59 }
60 }
61 }
62 }
63 return false;
64 }
65
66 int main()
67 {
68 int T;
69 scanf("%d",&T);
70 while(T--)
71 {
72 int i,j;
73 int white_num=0,black_num=0;
74 getchar(); //读入一个回车键
75 for(i=0;i<15;i++)
76 {
77 gets(map[i]);
78 }
79 for(i=0;i<15;i++)
80 {
81 for(j=0;j<15;j++)
82 {
83 if(map[i][j]=='W')
84 {
85 white_num++;
86 }
87 else if(map[i][j]=='B')
88 {
89 black_num++;
90 }
91 }
92 }
93 //记录黑白棋子的数量,主要是判断当前下棋方是黑还是白
94 if(black_num>white_num)
95 {
96 c='W';
97 }
98 else
99 {
100 c='B';
101 }
102 bool flag=true;
103 //只要找到一个“五子连”就可以了
104 for(i=0;i<15&&flag;i++)
105 {
106 for(j=0;j<15&&flag;j++)
107 {
108 if(map[i][j]==c)
109 {
110 flag=!bfs(i,j);
111 }
112 }
113 }
114 if(flag) printf("NO\n");
115 else printf("YES\n");
116 }
117 return 0;
118 }
转载于:https://www.cnblogs.com/tuanzang/archive/2013/02/27/2935770.html
吴昊品游戏核心算法 Round 5 —— 五子棋(无禁手)后台的判胜负AI(bfs+queue容器)(HDOJ 2699)...相关推荐
- 吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题
这样的场景我们应该经常遇到的吧,哈哈! 口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚. ...
- 吴昊品游戏核心算法 Round 5 ——(转载)关于无禁手下先手必胜的证明
关于五子棋先手必胜的证明,用人工的方式过于复杂,其难度相当于证明四色定理的正确性或者是若儿当定理的正确性.但是,如果采用计算机来解决,则复杂程度 会降低许多.由于很难地毯式地枚举到所有可能的情形,这一 ...
- 吴昊品游戏核心算法 Round 17 —— 吴昊教你玩拼图游戏(8 puzzle)
如图所示,这是一个九宫格(这倒是让我想起了小时候老师在黑板上教导我们的如何通过一系列的拼凑,将横行,竖行,以及斜行都拼到和相等),格子中有一个格子是空的,另外八个格子分别有数字1--8,我们的任务是将 ...
- 吴昊品游戏核心算法 Round 18 —— 吴昊教你玩Zen Puzzle Garden
如果你认为无法因为玩一个电脑游戏而达到精神的顿悟,你可能是正确的.不过你完全可以试着解决一个禅宗花园发生的难题,从而达到静心的精神状态. 这个游戏是获得2003年独立游戏节提名的精品游戏,在注重游 ...
- 吴昊品游戏核心算法 Round 17 —— 吴昊教你玩拼图游戏 序
如图所示,此人就是<死亡笔记>中最终击败夜神月的尼亚(当然,他在击败夜神月的过程中,利用了梅洛的一些帮助),尼亚喜欢玩各种玩具,比如乐高啊,多米诺骨牌啊等等,当然,他最喜欢的仍然是拼图.他 ...
- 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第四弹 拉帝亚斯?!拉帝欧斯?!...
作为讲述口袋妖怪的Round 16,这里,我会采用"夹叙夹议,夹议夹叙"的模式进行编排.也就是在议论一些口袋妖怪中的小游戏的核心算法的同时,叙述一下我对口袋妖怪的理解以及我与这一系 ...
- 吴昊品游戏核心算法 Round 9 —— 正统黑白棋AI(博弈树)
黑白棋程式简史 在1980年代,电脑并不普及,在黑白棋界里,最强的仍然是棋手(人类). 到了1990年代初,电脑的速度以几何级数增长,写出来的黑白棋程式虽然仍然有点笨拙,但由于计算深度(电脑的速度快) ...
- 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...
如图所示,此即为日本动漫棋魂中的千年佐为,也就是SAI.众所周知,围棋的规则相比于中国象棋,国际象棋等等都简单许多,真是因为更简单的规则,才诞生 了更复杂的逻辑.目前的围棋AI还很不行,最NB的应该是 ...
- 吴昊品游戏核心算法 Round 15 —— (转载)德州扑克中的心理战
在我的Round 15中的德州扑克的AI中,设计者曾经赋予了德州扑克一种不错的心理恐吓算法,具体地说,是如下的战术: 如果RR<0.8,那么95%选择弃牌,0%选择叫牌,5%选择加倍(这里加倍的 ...
- 吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第九弹 冰系道馆
道馆之战!!!这一次,道馆由电系变为了冰系,和龙系的道馆不一样,冰系的道馆有冰系的规定.如图所示,一共有三层,上面一层总是比下面一层要复杂一些.在冰系道馆中,有如下的两个规则:(1)我们不会在冰面上划 ...
最新文章
- Objective-C(十八、谓语使用及实例说明)——iOS开发基础
- linux下diff、patch制作补丁
- 2020兰大计算机学硕线,兰州大学2020年硕士研究生招生复试分数线
- Lambda 表达式与 Stream
- [模板] tarjan/联通分量/dfs树
- 各个系统下关闭占用端口号的进程
- leetcode题库--63不同路径 II
- 华为的哪个字体像苹果的_华为手机手写怎么变字体 苹果手写字体怎么变粗
- 动态爱心(C/C++)
- 在线预览打印Word文档
- es做mysql二级索引_用Elasticsearch实现HBase二级索引
- 论文中定性分析与定量分析的写作手法
- hdwiki php5.5,HDWiki 5.1 正式版推出 编辑器全新改版
- 图书条码mysql数据库_中琅条码软件如何连接MySQL批量生成128码
- 区域和检索 - 数组不可变(前缀和)
- 一个追风筝的人,追寻着什么
- python的算法是指_Python算法的七个重要特征
- sherlock软件使用_如何在不使用电缆的情况下播放BBC的“ Sherlock”
- 银河麒麟系统Java/NetCore开发环境
- VBA隐藏Word表格行
热门文章
- 【计算机毕业设计】疫情社区管理系统的设计与实现
- 怎么查看c语言库文件,C语言函数库和文件
- Tuxedo服务中间件
- 德芙网络营销策略ppt_看德芙网络营销策划经典案例,戳这里!
- Windows蓝屏代码查询(Bug Check Code)
- 计算机bios设置系统安装教程,U盘装系统BIOS设置教程进行设置图文教程
- 计算机安装系统说明,电脑操作系统安装方法-详细图解说明-简单安装Windows系统...
- 数据库常见面试题(附答案)
- java编码native2ascii下载_native2ascii.exe
- 背包问题-递归思想(C语言)