Java算法七:骑士走棋盘
骑士走棋盘(Knight tour)
问题说明:
骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。
骑士的走法为:先横或竖1或2格,再竖或横2或1格,没有中国象棋蹩脚的限制。 如:从图中的(a,1)格跳到(b,3)或(c,2)格
结果:
Java代码:
package com.allen; public class Knight { public boolean travel(int startX, int startY, int[][] board) { // 对应骑士可以走的八个方向 int[] ktmove1 = {-2, -1, 1, 2, 2, 1, -1, -2}; int[] ktmove2 = {1, 2, 2, 1, -1, -2, -2, -1}; // 下一个出路的位置 int[] nexti = new int[board.length]; int[] nextj = new int[board.length]; // 记录出路的个数 int[] exists = new int[board.length]; int x = startX; int y = startY; board[x][y] = 1; for(int m = 2; m <= Math.pow(board.length, 2); m++) { for(int k = 0; k < board.length; k++) { exists[k] = 0; } int count = 0; // 试探八个方向 for(int k = 0; k < board.length; k++) { int tmpi = x + ktmove1[k]; int tmpj = y + ktmove2[k]; // 如果是边界,不可以走 if(tmpi < 0 || tmpj < 0 || tmpi > 7 || tmpj > 7) { continue; } // 如果这个方向可以走,记录下来 if(board[tmpi][tmpj] == 0) { nexti[count] = tmpi; nextj[count] = tmpj; // 可走的方向加一个 count++; } } int min = -1; if(count == 0) { return false; } else if(count == 1) { min = 0; } else { // 找出下个位置的出路数 for(int l = 0; l < count; l++) { for(int k = 0; k < board.length; k++) { int tmpi = nexti[l] + ktmove1[k]; int tmpj = nextj[l] + ktmove2[k]; if(tmpi < 0 || tmpj < 0 || tmpi > 7 || tmpj > 7) { continue; } if(board[tmpi][tmpj] == 0) exists[l]++; } } int tmp = exists[0]; min = 0; // 从可走的方向寻找最少出路的方向 for(int l = 1; l < count; l++) { if(exists[l] < tmp) { tmp = exists[l]; min = l; } } } // 走最少出路的方向 x = nexti[min]; y = nextj[min]; board[x][y] = m; } return true; } public static void main(String[] args) { int[][] board = new int[8][8]; Knight knight = new Knight(); if(knight.travel( Integer.parseInt(args[0]), Integer.parseInt(args[1]), board)) { System.out.println("走棋完成!"); } else { System.out.println("走棋失败!"); } for(int i = 0; i < board.length; i++) { for(int j = 0; j < board[0].length; j++) { if(board[i][j] < 10) { System.out.print(" " + board[i][j]); } else { System.out.print(board[i][j]); } System.out.print(" "); } System.out.println(); } } } |
这里
Integer.parseInt(args[0]),
Integer.parseInt(args[1]), board))
需要设置一下参数:
Java算法七:骑士走棋盘相关推荐
- C++骑士走棋盘Knight tour算法(附完整源码)
骑士走棋盘Knight tour算法 骑士走棋盘Knight tour算法的完整源码(定义,实现,main函数测试) 骑士走棋盘Knight tour算法的完整源码(定义,实现,main函数测试) # ...
- 棋盘算法c语言程序,骑士走棋盘算法
[c]代码库#include /*骑士走棋盘算法,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完[所有的位置?*/ /*解法骑士的走法,基本上可以使用递回来解决,但是纯綷的递回在维度 ...
- 棋盘算法c语言程序,C语言经典算法 - 骑士走棋盘
搜索热词 @H_301_0@下面是编程之家 jb51.cc 通过网络收集整理的代码片段.@H_301_0@编程之家小编现在分享给大家,也给大家做个参考. 说明骑士旅游(Knight tour)在十八世 ...
- 骑士旅行问题(骑士走棋盘)
问题描述:一个骑士在棋盘中,给予其一个初始位置,求其是否能够走完整个棋盘. 骑士的走法和中国象棋的马走法相同,在前进过程中,骑士在其落足过的地方不能再次落足. 代码如下: //骑士走棋盘问题,骑士的走 ...
- 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)
说明:骑士旅游(Knight tour)在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完[所有的位置? 解法:骑士的走法 ...
- java编写类骑士游历_[基于Java的骑士游历问题的预见算法]骑士游历问题
摘要:骑士游历问题是经典的NP问题.在骑士游历问题常规算法的基础上,提出一个新的算法――预见算法,用Java实现该算法,提高程序的运行效率. 关键词:骑士游历:预见:Java算法 1 骑士游历问题 在 ...
- 用java写的马踏棋盘算法
用java写的马踏棋盘算法 将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码 /* 马踏棋盘问 ...
- java 算法 排序算法_Java七种排序算法以及实现
Java常见七种排序算法以及实现 最近学习一些排序算法,怕自己以后忘记就打算整理起来供自己复习 萌新一枚学习Java没多久,以下仅供参考.如有错误希望大佬指正,欢迎大家在评论区交流探讨. 1.冒泡排序 ...
- 刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java)
刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java) https://www.lanqiao.cn/problems/234/learning/ http://lx.lanqia ...
最新文章
- 又有多所高校延迟寒假开学
- 如何从JavaScript对象中删除项目[重复]
- MxGraph从入门到精通之1:运行HelloWorld示例程序
- 湊湊很好,但依旧“难撑”呷哺呷哺的野心
- 【Java代码】坐标系说明+WGS84\GCJ02\BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用)
- 注解@Component方式代替xml装配bean
- 只考计算机知识吗,计算机二级只考一门吗?计算机二级考什么?
- get online 免费注册一级.online后缀的域名
- LINQ to XML 编程基础
- Spring消息之STOMP
- 将ibatis.net中定义的statement转换为实际的sql语句
- vue导入音乐_苹果vue怎么导入音乐
- 《2019测试面试题-上海悠悠.pdf》
- opencms mysql_[转]OpenCms for MySql 安装图解
- Win11控制面板里没有高清音频管理器怎么办?
- ML之RL:强化学习Reinforcement Learning的简介、应用、经典案例、学习资源之详细攻略
- Python与数据库之学员管理系统
- Java程序员进阶架构师的五个阶段,你到了哪各阶段?
- 列表解析(值得学习)
- LeetCode42题,单调栈、构造法、two pointers,这道Hard题的解法这么多?
热门文章
- 碳纳米管修饰金电极|壳聚糖共价接枝碳纳米管复合材料|碳纳米管/二氧化钛/壳聚糖薄膜(CNTs/TiO2/CS)|血红蛋白在碳纳米管的修饰
- 运算重载符号(C++)
- 服务器的速度没有虚拟主机快,云服务器没有虚拟主机快
- 这是一首简单的小情歌
- linux进程的通信文件映射,Linux进程间通信 -- mmap函数的使用
- Vue一个案例引发「内容分发slot」的最全总结
- 找单身狗版本2(有两个单身狗)
- ffmpeg —— v4l2录制h264视频文件(边采集边转码)
- ventura 双系统win之间切换蓝牙设备自动连接教程
- 计算机组装与维修选择题大全,计算机组装与维修试题精选答案.跪求.