查找同色围棋子的广度和深度遍历方法

象棋人工智能算法的C++实现(一) 前言:自AlphaGo战胜世界著名九段围棋手李世石之后,我就对棋类人工智能产生了极大的兴趣,并想要自己实现象棋的人工智能。然而那个时候我还在读高二,没有这么深厚的代码基础,所以那个时候也就只能想想了。但是现在不一样了,通过学习编程,已经可以让我在棋类人工智能这个领域向前探索了。 首先说明一下本系列博客描述的人工智能算法不是基于机器学习、深度学习这么高深的知识,而是一种穷举找最优走法的算法。之所以... 阅读详情
原文地址: http://www.java2000.net/p9798

从A点开始进行4方向遍历
目的是找到和A点相连并且拥有相同棋面的棋子个数
  1. package net.java2000.ag;

  2. import java.awt.Point;
  3. import java.util.ArrayList;
  4. import java.util.List;

  5. /**
  6.  * 查找同色围棋子的广度遍历方法。
  7.  * 
  8.  * @author 赵学庆,Java世纪网(java2000.net)
  9.  * 
  10.  */
  11. public class ChessWideTraversal {


  12.   static char[][] chess = { { '1''1''1''1''1''1''1''1''1' },
  13.     { '1''1''1''1''1''1''1''1''1' },
  14.     { '1''1''1''1''0''0''0''1''1' },
  15.     { '1''1''1''1''0''1''0''1''1' },
  16.     { '1''0''0''1''A''1''1''1''1' },
  17.     { '1''1''0''0''0''1''1''1''1' },
  18.     { '1''1''1''1''0''1''1''1''1' },
  19.     { '1''1''1''1''0''1''1''1''1' },
  20.     { '1''1''1''1''1''1''1''1''1' },
  21.     { '1''1''1''1''1''1''1''1''1' } };
  22.   

  23.   // 如果已经遍历了,则不再重复
  24.   static boolean[][] haveFound = new boolean[chess.length][chess[0].length];

  25.   /**
  26.    * 被查找的广度遍历。
  27.    * 
  28.    * @param x
  29.    *          种子横坐标
  30.    * @param y
  31.    *          种子纵坐标
  32.    * @param sign
  33.    *          颜色
  34.    * @return 同色数组
  35.    */
  36.   public static List<Point> find(int x, int y, char sign) {
  37.     List<Point> list = new ArrayList<Point>();
  38.     Point p = new Point(x, y);
  39.     list.add(p); // 起始的种子
  40.     for (int i = 0; i < list.size(); i++) {
  41.       p = list.get(i);// 当前位置

  42.       // 左侧,没有到边界
  43.       if (p.x > 0) {
  44.         // 数值等于0 且没有找过
  45.         if (chess[p.y][p.x - 1] == sign && !haveFound[p.y][p.x - 1]) {
  46.           list.add(new Point(p.x - 1, p.y));
  47.           haveFound[p.y][p.x - 1] = true;
  48.         }
  49.       }

  50.       // 上侧,没有到边界
  51.       if (p.y > 0) {
  52.         // 数值等于0 且没有找过
  53.         if (chess[p.y - 1][p.x] == sign && !haveFound[p.y - 1][p.x]) {
  54.           list.add(new Point(p.x, p.y - 1));
  55.           haveFound[p.y - 1][p.x] = true;
  56.         }
  57.       }

  58.       // 右侧,没有到边界
  59.       if (p.x < chess[0].length - 1) {
  60.         // 数值等于0 且没有找过
  61.         if (chess[p.y][p.x + 1] == sign && !haveFound[p.y][p.x + 1]) {
  62.           list.add(new Point(p.x + 1, p.y));
  63.           haveFound[p.y][p.x + 1] = true;
  64.         }
  65.       }

  66.       // 下侧,没有到边界
  67.       if (p.y < chess[0].length - 1) {
  68.         // 数值等于0 且没有找过
  69.         if (chess[p.y + 1][p.x] == sign && !haveFound[p.y + 1][p.x]) {
  70.           list.add(new Point(p.x, p.y + 1));
  71.           haveFound[p.y + 1][p.x] = true;
  72.         }
  73.       }
  74.     }
  75.     return list;
  76.   }

  77.   /**
  78.    * 以图形形式显示遍历结果
  79.    */
  80.   private static void printGraph() {
  81.     for (int i = 0; i < chess.length; i++) {
  82.       for (int j = 0; j < chess[0].length; j++) {
  83.         System.out.print(haveFound[i][j] ? '*' : ' ');
  84.       }
  85.       System.out.println();
  86.     }
  87.   }
  88.   
  89.   public static void main(String[] args) {
  90.     List<Point> list = find(44'0');
  91.     printGraph();
  92.     for (Point p : list) {
  93.       System.out.println(p.x + "," + p.y);
  94.     }
  95.   }

  96. }



运行结果

        
        
    *** 
    * * 
 **     
  ***   
    *   
    *   
        
        
4,4
4,3
4,5
4,2
3,5
4,6
5,2
2,5
4,7
6,2
2,4
6,3
1,4
   

  1. package net.java2000.ag;
  2. /**
  3.  * 查找同色围棋子的深度遍历方法
  4.  * 
  5.  * @author xifo,Java世纪网(java2000.net)
  6.  * 
  7.  */
  8. public class ChessDeepTraversal {
  9.   private char[][] layout = { { '1''1''1''1''1''1''1''1''1' },
  10.       { '1''1''1''1''1''1''1''1''1' },
  11.       { '1''1''1''1''0''0''0''1''1' },
  12.       { '1''1''1''1''0''1''0''1''1' },
  13.       { '1''0''0''1''A''1''1''1''1' },
  14.       { '1''1''0''0''0''1''1''1''1' },
  15.       { '1''1''1''1''0''1''1''1''1' },
  16.       { '1''1''1''1''0''1''1''1''1' },
  17.       { '1''1''1''1''1''1''1''1''1' },
  18.       { '1''1''1''1''1''1''1''1''1' } };
  19.   // 9行 10列
  20.   private int w = 9, h = 10;
  21.   private boolean[][] flag = new boolean[h][w];
  22.   /**
  23.    * 以 x, y 为起点进行深度优先遍历
  24.    */
  25.   private void traverse(int x, int y) {
  26.     flag[x][y] = true;
  27.     // 尝试遍历左侧结点
  28.     if(x > 0 && !flag[x-1][y] && layout[x-1][y] == '0'){
  29.       traverse(x - 1, y);
  30.     }
  31.     // 尝试遍历上侧结点
  32.     if(y > 0 && !flag[x][y-1] && layout[x][y-1] == '0'){
  33.       traverse(x, y - 1);
  34.     }
  35.     // 尝试遍历右侧结点
  36.     if(x < w - 1 && !flag[x + 1][y] && layout[x + 1][y] == '0'){
  37.       traverse(x + 1, y);
  38.     }
  39.     // 尝试遍历下侧结点
  40.     if(y < h - 1 && !flag[x][y + 1] && layout[x][y + 1] == '0'){
  41.       traverse(x, y + 1);
  42.     }
  43.   }
  44.   /**
  45.    * 以图形形式显示遍历结果
  46.    */
  47.   private void printGraph() {
  48.     for (int i = 0; i < h; i++) {
  49.       for (int j = 0; j < w; j++) {
  50.         System.out.print(flag[i][j] ? '*' : ' ');
  51.       }
  52.       System.out.println();
  53.     }
  54.   }
  55.   /**
  56.    * 以坐标形式显示遍历结果
  57.    */
  58.   private void printCoordinates() {
  59.     System.out.println("遍历到的结点坐标:");
  60.     for (int i = 0; i < h; i++) {
  61.       for (int j = 0; j < w; j++) {
  62.         System.out.print(flag[i][j] ? (j + ", " + i + "/n") : "");
  63.       }
  64.     }
  65.   }
  66.   public static void main(String[] args) {
  67.     // 遍历起点坐标
  68.     int x = 4, y = 4;
  69.     ChessDeepTraversal cdt = new ChessDeepTraversal();
  70.     cdt.traverse(x, y);
  71.     cdt.printGraph();
  72.     cdt.printCoordinates();
  73.   }
  74. }
         运行结果

        
        
    *** 
    * * 
 ** *   
  ***   
    *   
    *   
        
        
遍历到的结点坐标:
4, 2
5, 2
6, 2
4, 3
6, 3
1, 4
2, 4
4, 4
2, 5
3, 5
4, 5
4, 6
4, 7
     

【OpenCV】计算围棋棋子的块数坐标(使用深/广度搜索实现4邻域查找 1、问题描述: 给定一个n*n的围棋盘,交叉点上分布着黑,白子或空白(分别用字符b,w n表示), 相的棋子在行或列相连属于一块棋,请遍历整个围棋盘,计算黑白棋各有几块。 输入:第一行只有一个整数n(0&lt;n&lt;20),表示棋盘的大小。 接下来n行中,包含n个字符,分别用字符b,w n表示黑,白子或空白。 输出:两个整数,分别表示黑,白棋各有几块。 打印出属于一区域的棋... 阅读详情

相关推荐

java解析sgf格式文件简单实现

围棋棋谱一般被保存为sgf格式,要想在自己的网站中实现打谱功能,必要要会解析sgf文件,取出里面的对局信息落子,楼主现在用一种比较简单的方法来解析它 说明:楼主所用的棋谱是从新浪围棋里下载来的,示例用的是第10届中国围棋龙星战半决赛江维杰VS辜梓豪 文件内容如下(其他sgf格式也差不多,就是有些字段的名字换了一下) ( TE[第10届中国围棋龙星战半决赛] RD[2019-05-28] ...

qq_41957257的博客 3867

一种基于人工智能技术的围棋盘面识别方法

一种基于人工智能技术的围棋盘面识别方法 用于摄像头识别围棋棋盘

【题解】【AcWing】3509. 棋盘遍历问题

3509. 棋盘遍历问题 原题传送:AcWing 3509. 棋盘遍历问题 给定一个 N×MN \times MN×M 的方格棋盘,请问一个棋子从棋盘左上角出发,能否在不重复经过棋盘上的方格的情况下,遍历整个棋盘一次再回到起点。 输入格式 输入包含多组测试数据。 每组数据占一行,包含两个整数 N,MN,MN,M 。 输出格式 每组数据输出一行一个结果,如果能回到起点则输出 Y,否则输出 N。 数据范围 1≤N,M≤101 \le N,M \le 101≤N,M≤10 输入样例: 1 2 2 2 输出样例:

葑鈊丶 966

解密Google Deepmind AlphaGo围棋算法

2016年1月28日,Google Deepmind在Nature上发文宣布其人工智能围棋系统AlphaGo历史性的战胜人类的职业围棋选手!这条重磅新闻无疑引起了围棋人工智能界的广泛关注!3月份AlphaGo对阵李世石的比赛更将引起全人类的目光! 是什么使围棋算法产生了质的飞跃?要知道,在之前最好的围棋程序也只能达到业余人类棋手的水平。是真的人工智能产生了吗? 对于大多

cjianwyr的博客 1万+

华为机试—围棋吃子(下围棋)判决(高级题160分:深度优先遍历)(图文吐血整理)

题目: 围棋中,一个棋子在棋盘上,与它直接紧邻的空点是这个棋子的“气”,棋子直接紧邻的点上,如果有妻子存在,则它们便相互组成一个不可分割的整体,它们的“气”也应一并计算。如果一个或一片棋子的“气”为0,那它们将被吃掉。 1. 一个棋子的情况,如下左图,白棋右侧还有一个空点,此时白棋气为1,不会被吃掉。当黑棋在此空点下棋后,白棋气为0,将被吃掉。 2. 一片棋子的情况,如下图,

小地盘的诺克萨斯 2万+

深信服2018春季招聘-研发卷编程题 - 题解

深信服还是一如既往的“懒”,2018秋招的5个编程题在本次春招出现了三道,然后添加了一道新的编程题,且选择题填空题基本与秋招的雷,看来之前没看深信服2018校园招聘C++工程师编程题 - 题解的学有点亏啊。我猜深信服明年的编程题估计还是这样,不看亏的是自己(瞎吹一波)。 这次题解只给出新添加的那道编程题的解析与代码,时修正深信服2018校园招聘C++工程师编程题 - 题解中第五题:围棋...

FlushHip 5177

JAVA(五子棋)

思路 1:棋盘布局; 2:下棋功能。 3:悔棋功能。 4:判断胜负。 棋盘布局(GoBangframe)

every step 1万+

两颗棋子找出100层大厦中棋子摔碎的临界层

题意大概是这样:有一座100层的大厦,还有两个完全相的棋子,问怎样扔棋子能够使得最坏情况下扔的棋子次数尽量少。1.可以从第一层开始扔,直到第99层为止,那么最多扔棋子次数为99,显然不行,而且第二颗棋子没发挥其作用。2.不管怎样,我们都可以建立一个模型:第一颗棋子依次扔的楼层为X1,X2,X3,……,Xn,假如在Xi层摔碎,说明临界层大于X(i-1)小于等于Xi,这时用第二颗棋子从X(i-1)+1

dolpphins的专栏 2208

围棋盘,相并连接在一起的一些棋子为一块,请写代码统计出白棋子的块数

#include #include <stdio.h> typedef struct goposition{ char colour; // ‘w’:白, ‘b’:黑, ‘n’:空 bool cuntflg; //true:已统计,false:未统计 }goNode;//位置属性 const int MAXLINE = 4; //最大行数 goNode gomap[MAXLINE...

weixin_45573277的博客 573

图像识别之棋子识别

可用于象棋,五子棋等的棋盘棋子的识别棋盘重构~~ 核心处理:棋子特征提取 转载于:https://www.cnblogs.com/yemuzi/archive/2013/04/01/2994308.html

weixin_30673715的博客 2216

围棋AI之路(一)理论

注:本文其实只介绍mogo程序所采用的MC+UCT算法。记得以前还曾为深蓝击败顶尖人类棋手而暗喜,庆幸自己选择了围棋这一体现人类智慧优越感的游戏。因为人机博弈的设计不外乎两个方面:估值搜索,而这两者在国际象棋上表现非常好,深蓝仅仅靠的暴力搜索下出的妙手让大师也手足无措,你要不信,去问问卡斯帕罗夫深蓝对局时什么感受。然后估值搜索用在围棋上似乎失灵了,一来无值可估,计算机如何看待局部的好手成了全

oyd的专栏 2万+

java9-8复盘

表达式(short)10/10.2*2运算后结果是什么类型? 正确答案:C A.short B.int C.double D.float 解析: 强制类型转换的优先级高于+ - * /,所以short只把10强制转换为了short 假定Base b = new Derived(); 调用执行b.methodOne()后,输出结果是什么? A public class Base { public ...

羽翼的博客 323

网易之小易有一块n*n的棋盘,棋盘的每一个格子都为黑或者白,小易现在要用他喜欢的红去涂画棋盘。小易会找出棋盘中某一列中拥有相的最大的区域去涂画

import java.util.Arrays; import java.util.Scanner; /** * 小易有一块n*n的棋盘,棋盘的每一个格子都为黑或者白,小易现在要用他喜欢的红去涂画棋盘。小易会找出棋盘中某一列中拥有相的最大的区域去涂画, * 帮助小易算算他会涂画多少个棋格。 * * @author pomay * */ public class Wang

pomay的博客 3044

【转】享元模式——实现对象的复用

【作者:刘伟http://blog.csdn.net/lovelion】 当前咱们国家正在大力倡导构建谐社会,其中一个很重要的组成部分就是建设资源节约型社会,“浪费可耻,节俭光荣”。在软件系统中,有时候也会存在资源浪费的情况,例如在计算机内存中存储了多个完全相或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高,内存属于计算机的“稀缺资源”,不应该用来“随便浪费”,那么是否存...

weixin_30711917的博客 288
上一篇: URLEncoder的只编码中文字符的类
下一篇: 正则只替换URL字符串里面的汉字部分
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值