马踏棋盘(Java版)
问题:
国际象棋的棋盘为8*8的方格棋盘。现将”马”放在任意指定的方格中,按照”马”走棋的规则将”马”进行移动。要求每个方格只能进入一次,最终使得”马”走遍棋盘的64个方格。
思路:
这个问题一般有两种思路来解决,
一种就是用深度优先搜索,采用递归+回溯的方式,一个棋盘可以看成有64层深度的一棵树,每一个节点最多有8个子节点,采用深搜可以很方便的解决这个问题,但是深搜这个方法时间复杂度太高了,最多要搜8^64次
第二种就是贪心算法,选择眼前认为最优的点。这里什么是最优的点,就是选择后续节点最少的那一个,哪一个点的下一步少,就选哪一个。基于贪心算法可以快速的得搜索到结果,效率提高很多。
以下是采取回溯法,在遍历下一步的时候采用贪心算法,计算下一步的下一步有多少路径可以走,选择路径最少。
代码:
/** 马踏棋盘问题:(贪婪法求解)* 棋盘有64个位置,“日”字走法,刚好走满整个棋盘*///下一个走法的方向类class Direction{int x;int y;int wayOutNum;}public class Hores_chessboard_1 {static final int[] dx = { -2, -1, 1, 2, 2, 1, -1, -2 }; // x方向的增量 static final int[] dy = { 1, 2, 2, 1, -1, -2, -2, -1 }; // y方向的增量 static final int N = 8; static int[][] chessboard = new int[N][N]; // 棋盘 /*** * @param nami* @param x,y为棋子的位置* @return 如果棋子的位置不合法,则返回一个大于8的数。* 否则返回棋子的下个出路的个数*/static int wayOut(int x, int y){ int count = 0;int tx, ty, i;//判断是否超出棋盘边界,该位置是否已经下过if(x<0 || x>7 || y<0 || y>7 || chessboard[x][y]!=0){return 9;}for(i=0; i<N; i++){tx = x+dx[i];ty = y+dy[i];//如果棋子的下个出路可行,则出路数自加一次if(tx>-1 && tx<8 && ty>-1 && ty<8 && chessboard[tx][ty]==0)count++;}return count;}/*** 按照棋子的下个出路的个数从低到高排序* @param next 棋子的八个位置的数组*/static void sort(Direction[] next){int i, j, index;Direction temp = null;//这里用的选择排序for(i=0; i<N; i++){index = i;for(j=i+1; j<N; j++){if(next[index].wayOutNum > next[j].wayOutNum)index = j;}if(i != index){temp = next[i];next[i] = next[index];next[index] = temp;}}}static void Move(int x, int y, int step){int i, j;int tx, ty;//如果step==64,则说明每个棋格都走到了,现在只需要打印结果就完了if(step == N*N){for(i=0; i<N; i++){for(j=0; j<N; j++){System.out.printf("%3d", chessboard[i][j]);}System.out.println();}System.exit(0);}//下一个棋子的N个位置的数组Direction[] next = new Direction[N];for(i=0; i<N; i++){Direction temp = new Direction();temp.x = x+dx[i];temp.y = y+dy[i];next[i] = temp;//循环得到下个棋子N处位置的下个出路的个数next[i].wayOutNum = wayOut(temp.x, temp.y);}//配合贪婪算法,按下个棋子的下个出路数排序后,next[0]就是下个出路数最少的那个sort(next);for(i=0; i<N; i++){tx = next[i].x;ty = next[i].y;chessboard[tx][ty] = step;Move(tx, ty, step+1);/*如果上面Move()往下一步走不通,则回溯到这里重置chessboard[tx][ty]为0,接着i++,又循环...... */chessboard[tx][ty] = 0;}}public static void main(String[] args) {int i, j;//初始化棋盘for(i=0; i<8; i++){for(j=0; j<8; j++){chessboard[i][j] = 0;}}System.out.println("请输入棋子开始位置(0-7):");Scanner sc = new Scanner(System.in);int x = sc.nextInt();int y = sc.nextInt();//第一步不用比较,赋值第一步chessboard[x][y] = 1;Move(x, y, 2); }
}
转载自:https://blog.csdn.net/sinat_18127633/article/details/44891949
马踏棋盘(Java版)相关推荐
- java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...
前言需求 今天我们学习的是马踏棋盘算法,我们还是从一个场景里引入看看 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的6×6棋盘Board0-5的某个方格中 提示:马按走棋规则(马走日字)进行 ...
- Java对马踏棋盘问题(骑士周游问题)的实现
14.10.2 马踏棋盘游戏代码实现 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个 ...
- Day600601.马踏棋盘算法 -数据结构和算法Java
马踏棋盘算法 图的深度优先DFS 回溯 八皇后问题.小老鼠找迷宫问题 一.介绍 二.思路分析 三.代码实现 package com.achang.algorithm;import java.awt.* ...
- 用java写的马踏棋盘算法
用java写的马踏棋盘算法 将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码 /* 马踏棋盘问 ...
- 马踏棋盘问题(C++版)
递归求解(回溯法求解),列出所有的解: 主要注意对各种参数的定义不要弄混,细心表达各种变量,可以在棋盘中设置墙壁,便于debug的检查与分析,并确定各种方向(dx[8]={1,1,-1,-1,2,2, ...
- 基于Java Swing 的马踏棋盘小游戏(附源码!免费下载!)
马踏棋盘游戏小项目 设计主要功能 运用的数据结构 运行流程讲解及录像 项目分类截图及源码链接! 设计主要功能 (1)设计内容:设计一个马踏棋盘游戏,马作为棋子,以马走日字的走法,将整个棋盘一次性走完, ...
- 【算法篇】/*一篇博客带你详细了解马踏棋盘问题*/(java语言实现)
[前言]本文部分内容引用于b站尚硅谷老师的资料,如有侵权,请及时联系作者! hello大家好! 我依然是你们熟悉的槿凉.那么最近呢由于躺平了几天,也没有来得及更新博客,没有办法啦!学校封的严严实实,闷 ...
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- 骑士周游(马踏棋盘)问题
1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...
最新文章
- C++中vector的使用
- WPF绘制简单常用的Path
- 继承Thread 创建多线程的简单实现
- 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...
- linux系统下如何查找文件(根据文件属性或者根据文件内容)
- Arduino 各种模块篇 motor shield 电机扩展板(舵机、直流电机、步进电机party)
- 记录:txt文本分割命令,用于notepad++无法打开情况下分割文件
- 完美解决Tensorflow不支持AVX2指令集问题
- u盘测试工具linux,MultiBootUSB简单测试工具 V7.5.0 升级版
- 自监督学习(Self-supervised Learning)的深刻理解
- Python OpenCV 在视频上添加文字后保存视频
- 电脑隐藏文件夹如何把它显示出来
- 解决笔记本电脑使用网线正常,使用无线网络速度慢的问题
- linux 无线网卡 频段,Linux 网卡配置 (频段、发射功率等)
- 瑤里古鎮 婺源鄉村 你會去哪里呢
- python深度学习include框架_《用Python实现深度学习框架》上市
- 风变编程学习笔记0-3关【纯代码版】
- 推荐一款在线伪原创工具,很适合做seo的朋友
- excel中地理坐标经纬度格式调整:保留两位小数
- 360手机:360N5S Twrp、Root、Magisk教程
热门文章
- 日期计算 节假日 一年有多少天放假
- IO复用在阻塞IO下的坑及解决
- 接口继承和实现继承的区别
- 2022年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
- 片云天共远,永夜月同孤。—第五十二天
- java中having的意思,Having 的用法(转)
- 编程中国 ------中国最大的编程网站 :https://www.bccn.net/
- android 编译生成文件,Android编译生成文件夹(out)详解
- 微擎获取openid_微信订阅号通过获取Openid并获取用户基本信息
- IDEAidea导入Scala包