问题描述

在上一个问题的基础上,如果事先将棋盘中设置有的地方已经被占据,马跳的过程中可能被别脚,如果马能够跳完剩下的棋盘,则遍历输出路径,如果不能跳完,则打印“没有找到全遍历路径”

输入

输入的第一行包含一个正整数n(n< =100)。
第二行为一个小于n * n的整数m。
接下来m行都包含两个整数,每一行代表第i行,第j列的位置已经有棋子。
接下来一行包含两个数,代表起点。

输出

马的遍历路径或者“没有找到全遍历路径。


解法:回溯剪枝

思路

(1)思路同上一题目一样,区别在于判断下一个位置是否可行的条件需要改变
(2)此题需要增加是否被别脚的情况,如果被别脚,则往回跳,继续向其他方向试探

代码

import java.util.Scanner;/*** 象棋中马的轨迹(有别脚)** @author Administrator**/
public class HoursePlus {/* 存储棋盘 */static int[][] arr;/* 棋盘的宽度 */static int n;/* 别脚的个数 */static int m;/* 马跳棋盘的8个方向 */static int[][] dir = { { -1, -2 }, { -1, 2 }, { -2, 1 }, { -2, -1 },{ 1, 2 }, { 1, -2 }, { 2, -1 }, { 2, 1 } };public static void main(String[] args) {@SuppressWarnings("resource")Scanner scanner = new Scanner(System.in);n = scanner.nextInt();arr = new int[n][n];m = scanner.nextInt();for (int k = 0; k < m; k++) {int i = scanner.nextInt();int j = scanner.nextInt();// 已经被占据的位置用-1表示arr[i][j] = -1;}int startI = scanner.nextInt();int startJ = scanner.nextInt();// 马开始跳的起点arr[startI][startJ] = 1;findPath(startI, startJ, 2);System.out.println("没有找到全遍历路径");}/*** 在棋盘中寻找马是否有可行路径,有则打出一个** @param startI* @param startJ*/private static void findPath(int startI, int startJ, int num) {// 停止条件:已经遍历剩余的整个棋盘if (num == n * n - m + 1) {dispaly(arr);System.exit(0);} else {for (int k = 0; k < 8; k++) {int ii = startI + dir[k][0];int jj = startJ + dir[k][1];// 判断下一位置是否可行if(judge(ii, jj, startI, startJ)){// 走过这里标记arr[ii][jj] = num;findPath(ii, jj, num + 1);// 走过,但是路径走不通,马跳回来,取消这里的标记arr[ii][jj] = 0;}}}}private static boolean judge(int ii, int jj, int i, int j) {int b1 = ii - i > 0 ? 1 : -1;int b2 = jj - j > 0 ? 1 : -1;// 别脚的位置i += b1;j += b2;// 判断别脚是否有棋子if(i >= 0 && i < n && j >= 0 && j < n){if(arr[i][j] == -1){return false;}}// 判断下一个位置是否已经被跳过if(ii >= 0 && ii < n && jj >= 0 && jj < n){if(arr[ii][jj] == 0){return true;}}return false;}/*** 遍历输出* @param arr*/private static void dispaly(int[][] arr) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.printf("%3d", arr[i][j]);}System.out.println();}System.out.println();}}

运行结果

【回溯】有蹩脚的马踏棋盘——思路巨清晰!!!相关推荐

  1. 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...

    马踏棋盘算法介绍和游戏演示 1.马踏棋盘算法也被称为骑士周游问题 2.将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一 ...

  2. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

  3. java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...

    前言需求 今天我们学习的是马踏棋盘算法,我们还是从一个场景里引入看看 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的6×6棋盘Board0-5的某个方格中 提示:马按走棋规则(马走日字)进行 ...

  4. 骑士周游(马踏棋盘)问题

    1,马踏棋盘算法介绍 马踏棋盘问题也被称为骑士周游问题 将马随机放在国际象棋的8*8的棋盘中的某个格子里,马按照走棋规则(日子)进行移动.要求每个方格只进入一次,走遍64个方格 2,马踏棋盘算法思路分 ...

  5. Java对马踏棋盘问题(骑士周游问题)的实现

    14.10.2 马踏棋盘游戏代码实现 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个 ...

  6. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析

    马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...

  7. Day600601.马踏棋盘算法 -数据结构和算法Java

    马踏棋盘算法 图的深度优先DFS 回溯 八皇后问题.小老鼠找迷宫问题 一.介绍 二.思路分析 三.代码实现 package com.achang.algorithm;import java.awt.* ...

  8. 数据结构(七)——Dijkasta 、Flyod、马踏棋盘算法

    Dijkstra 算法 应用场景-最短路径问题 有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到A, B, C , D, E, F 六 ...

  9. c语言数据结构之马踏棋盘

    c语言数据结构之马踏棋盘 马踏棋盘游戏 (一)思路: 马随机放在国际象棋的 8×8 棋盘 Board[07][07]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部 64 个 ...

  10. 马踏棋盘(Java版)

    问题: 国际象棋的棋盘为8*8的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移动.要求每个方格只能进入一次,最 ...

最新文章

  1. iPhone开发应用Sqlite使用手册
  2. 全球及中国6氯5氨基邻甲酚行业深度调研与运营潜力分析报告2022版
  3. SSO单点登录和OAuth2.0的区别和理解
  4. 一线大厂在机器学习方向的面试题(一)
  5. 理论基础 —— 查找 —— 插值查找
  6. 在此iphone上尚未受信任_通知:这5款iPhone过保依然可以免费维修
  7. php底层运行机制(二)
  8. Linux用awk处理文本数据
  9. android adb 刷机工具,ADB 工具 ADB 工具刷机-完美教程资讯
  10. 浅析iOSApp签名原理及流程
  11. 宋红康jvm学习p1-100
  12. 利用OpenGL模拟太阳系
  13. 工欲善其事,必先利其器-器
  14. c语言编程情话,c语言浪漫情话
  15. 微信java精简版低内存_微信精简版低内存apk-微信精简版2019下载v7.0.6 安卓版-腾牛安卓网...
  16. 爬虫:Xpath定位
  17. 敏捷项目用户故事地图
  18. 佟刚老师javaweb笔记(二)
  19. ubuntu16.04调试5G模组ZM9000
  20. 东北大学5月校赛c题

热门文章

  1. L1 和 L2的区别
  2. pvs-stdio ue4_PlatformIO中的PVS-Studio集成
  3. C++ Beep()演奏简谱的改进以及实现背景音乐
  4. k8s 1.18.20 kubevirt v0.47.1 创建 windows10 虚拟机
  5. AI三驾马车之深度学习框架
  6. Nature:细菌增长和扩张的平衡机制
  7. anconda json.decoder.JSONDecodeError: Expecting property name enclosed in double quo
  8. Flash 101-第1部分:锤子和凿子
  9. python 全栈什么意思_python全栈指的是什么意思
  10. 哈霍兰服务器修改WCL记录,魔兽世界:怀旧服哈霍兰服务器再创纪录,最强“刷子”六天刷出420万荣誉...