`
z2009zxiaolong
  • 浏览: 76573 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论
阅读更多
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * M*M宫格棋盘求解是否存在N个棋子连在一条线上, 比如N=5就是常见的五子棋问题
 */
public class Chess {
	private static final int M = 6;// 棋盘的宫格数
	private static final int N = 5;// N子棋问题

	public static void main(String[] args) {
		Chess chess = new Chess();
		chess.solve();
	}

	public void solve() {
		int[][] data = new int[M][M];
		Random random = new Random();
		for (int i = 0; i < M; i++) {
			for (int j = 0; j < M; j++) {
				// 每随机放一个棋子就判断一次
				if (random.nextBoolean()) {
					data[i][j] = 1;
					if (judge(data)) {
						System.out.println("==棋盘中存在" + N + "个棋在一条线。==");
						print(data);
						return;
					} else {
						System.out.println("棋盘中不存在" + N + "个棋在一条线。");
						print(data);
					}
				}
			}
		}
	}

	// 判断是否存在N个棋子连在一条线上
	public boolean judge(int[][] data) {
		boolean flag = false;
		// 需要判断M-(N-2)宫格是否存在N个棋子连在一条线上
		for (int i = 0; i < data.length - (N - 1); i++) {
			for (int j = 0; j < data[i].length - (N - 1); j++) {
				int[][] temp = new int[N][N];
				for (int x = 0; x < N; x++) {
					for (int y = 0; y < N; y++) {
						temp[x][y] = data[x + i][y + j];
					}
				}
				if (judgeArr(temp)) {
					return true;
				}
			}
		}
		return flag;
	}

	// 判断一个N维矩阵是否存在N个棋子连在一条线上
	private boolean judgeArr(int[][] data) {
		boolean flag = false;
		Map<Integer, Integer> rowMap = new HashMap<Integer, Integer>(N);// 记录某行的棋子数
		Map<Integer, Integer> colMap = new HashMap<Integer, Integer>(N);// 记录某列的棋子数
		// 统计所有棋子的位置特性
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (data[i][j] == 1) {
					// 统计某行的棋子数
					if (rowMap.containsKey(i)) {
						rowMap.put(i, rowMap.get(i) + 1);
					} else {
						rowMap.put(i, 1);
					}
					// 统计某列的棋子数
					if (colMap.containsKey(j)) {
						colMap.put(j, colMap.get(j) + 1);
					} else {
						colMap.put(j, 1);
					}
				}
			}
		}
		
		int lcount = 0;// “\”对角线方向上的棋子数
		int rcount = 0;// “/”对角线方向上的棋子数
		for (int i = 0; i < N; i++) {
			if (rowMap.get(i) != null && rowMap.get(i) == N) {
				return true;
			}
			if (colMap.get(i) != null && colMap.get(i) == N) {
				return true;
			}
			if (data[i][i] == 1) {
				lcount++;
				if (lcount == N) {
					return true;
				}
			}
			if (data[i][N - i - 1] == 1) {
				rcount++;
				if (rcount == N) {
					return true;
				}
			}
		}
		return flag;
	}

	// 打印矩阵中的数据
	private void print(int[][] data) {
		System.out.println("矩阵中的数据:");
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < data[i].length; j++) {
				System.out.print(" " + data[i][j]);
			}
			System.out.println();
		}
	}
}
1
5
分享到:
评论

相关推荐

    五子棋先手必胜的算法

    计算机执黑必胜的算法求解源码。 五子棋终结者的算法求解过程..所需要的全部知识只是C语言、二叉树和对五子棋规则的了解,并不需要多么好的棋力才可以写程序,只是将想法赋予机器。

    五子棋博弈理解

    博弈是用来解决一组决策者之间冲突或合作问题的数学方法.在实现玩家和电脑之间的五子棋对弈时...经过对五子棋的一种博弈算法设计和实现的分析,总结出五子棋问题求解的算法思路,并分析出算法的性能瓶颈及相应的解决方案.

    精选_毕业设计_基于贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏_完整源码

    基于贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏

    基于 C++实现人工智能课程五子棋博弈问题【100010704】

    以五子棋人机博弈问题为例,实现 α-β 剪枝算法的求解程序(编程语言不限),要求设计适合五子棋博弈的评估函数。 要求初始界面显示 15*15 的空白棋盘,电脑执白棋,人执黑棋,界面置有重新开始、悔棋等操作。 设计...

    太原理工大学AI实验报告

    掌握盲目搜索算法之一的宽度优先搜索求解算法的基本思想。对于宽度优 先搜索算法基本过程,算法分析有一个清晰的思路,了解宽度优先搜索算法在实际生活中的应用。 B。1.加深对各种状态图搜索策略概念的理解; 2.熟悉...

    人工智能下五子棋(基于博弈树极大极小值alpha-beta剪枝搜索算法)

    人工智能下五子棋(基于博弈树极大极小值alpha-beta剪枝搜索算法),代码解析链接参见网址:https://blog.csdn.net/m0_38106923/article/details/93347117

    基于强化学习的五子棋.zip

    求解强化学习问题所使用的算法可分为策略搜索算法和值函数(value function)算法两类。 强化学习理论受到行为主义心理学启发,侧重在线学习并试图在探索-利用(exploration-exploitation)间保持平衡。不同于监督...

    C++基于EasyX的AI五子棋源码+项目说明+代码注释+exe可执行程序(课程作业).zip

    本实验以五子棋人机博弈问题为例,利用C++语言实现α-β剪枝算法的求解程序,并以棋型个数和权重为基础设计了适合五子棋博弈的评估函数。利用EasyX图形库显示15*15的空白棋盘,电脑执白棋,人执黑棋,黑棋先手,界面...

    基于强化学习的五子棋人工智能系统.zip

    求解强化学习问题所使用的算法可分为策略搜索算法和值函数(value function)算法两类。 强化学习理论受到行为主义心理学启发,侧重在线学习并试图在探索-利用(exploration-exploitation)间保持平衡。不同于监督...

    C语言常用算法

    第一部分 基础篇 ...216 五子棋游戏 第八部分 综合实例篇 217 综合CAD系统 218 功能强大的文本编辑器 219 图书管理系统 220 进销存管理系统 //========= End of the file. 文件内容结束 ===============\\

    五子棋实验1

    1.以五子棋人机博弈问题为例,实现α-β剪枝算法的求解程序(编程语言不限),要 2.要求初始界面显示 15*15 的空白棋盘,电脑执白棋,人执黑棋,界面置有重新

    Meta-Zeta是一个基于强化学习的五子棋(Gobang)模型,

    求解强化学习问题所使用的算法可分为策略搜索算法和值函数(value function)算法两类。 强化学习理论受到行为主义心理学启发,侧重在线学习并试图在探索-利用(exploration-exploitation)间保持平衡。不同于监督...

    java实现网络五子棋源码-AI-Sudoku:一个用人工智能解决数独棋盘的实验

    求解器使用蒙特卡罗树搜索算法来查找数独板的可能解决方案。 与之前使用硬编码逻辑的求解器不同,该求解器还使用迭代方法来穷尽板的可能组合来解决它,而是使用 MCTS,它本质上通过比较每个单独块的概率来计算板的下...

    基于QT(C++) a-b 剪枝实现五子棋 AI【100012711】

    主要实现了玩法一的AI,通过极大极小衍生的a-b剪枝算法实现了一个初步的人工智能棋手,与玩家对弈。极大极小搜索策略是考虑双方对弈若干步之后,从可能的步中选一个相对最好的走法来走,即在优先的搜索深度范围内...

    matlab控制代码-CodeBin:一些经典的实践游戏

    matlab控制代码 Attention 所有将不再维护的代码! 说明 ...A_star_maze:一个使用A*算法实现迷宫求解的例子 Genetic_Algorithm_TSP: 遗传算法解决TSP代码 calculator: 编译原理实践--计算器 coolweathe

    java自学之道

    第一篇 基础篇 第0章 JDK安装和最简单的环境变量配置方法 ...6.8 五子棋 6.9 人机猜拳游戏 第三篇 实战篇 第7章 项目开发 7.1 开发自己的浏览器 7.2 开发自己的象棋游戏 7.3 网络主机线程扫描与端口控制

    C程序范例宝典(基础代码详解)

    4.1 简单问题算法 184 实例120 任意次方后的最后三位 184 实例121 计算π的近似值 184 实例122 小于500的所有勾股数 185 实例123 能否组成三角形 186 实例124 偶数拆分 187 实例125 乘积大于和的数 ...

    vc代码合集

    2012-06-11 10:02 230,400 微分方程的Matlab求解.ppt 2012-06-11 11:17 4,664,801 捉虫历险记——常见C++Bug大围剿.pdf 2012-06-11 10:09 8,729,676 搭建自己的搜索引擎.rar 2012-06-11 10:54 1,183,278 模式识别与...

Global site tag (gtag.js) - Google Analytics