编程暴力破解一笔画游戏。
github地址:https://github.com/NPCDW/Unicursal
demo地址:https://npcdw.github.io/Unicursal/
public class Unicursal {// 步骤从1开始private static int count = 1;/*** 寻路 每走一步都会有三个方向可以走,如果无路可走,遍历一下是否还有未走的格子* 如果没有,则寻路成功,打印出路径,如果有,则退一步,走其他方向** @param x 起始位置第几行* @param y 起始位置第几列* @param matrix 棋盘数组(0代表可以走的路,-1代表障碍,1,2,3....代表路径)*/private static void pathfind(int x,int y,int[][] matrix){matrix[x][y] = count++;// 如果下一步没有超出y的最大边界,并且下一步可以走if (y+1 < matrix[x].length && matrix[x][y+1]==0){pathfind(x,y+1,matrix);}// 如果下一步没有超出y的最小边界,并且下一步可以走if (y-1 >= 0 && matrix[x][y-1]==0){pathfind(x,y-1,matrix);}// 如果下一步没有超出x的最大边界,并且下一步可以走if (x+1 < matrix.length && matrix[x+1][y]==0){pathfind(x+1,y,matrix);}// 如果下一步没有超出x的最小边界,并且下一步可以走if (x-1 >= 0 && matrix[x-1][y]==0){pathfind(x-1,y,matrix);}// 走到此,说明已经无路可走,遍历一下是否还有未走的格子for (int i=0;i<matrix.length;i++){for (int j=0;j<matrix[i].length;j++){// 如果有未走的格子,说明寻路失败,退一步继续寻路if (matrix[i][j]==0){matrix[x][y] = 0;count--;return;}}}// 走到此,说明没有未走的格子,说明寻路成功,打印输出路径for (int i=0;i<matrix.length;i++){for (int j=0;j<matrix[i].length;j++){System.out.print(String.format("%3d", matrix[i][j]));}System.out.println();}// 退出程序System.exit(-1);}/*** 举个栗子*/public static void main(String[] args) {// 棋盘数组(0代表可以走的路,-1代表障碍)int[][] matrix = {{ 0, 0, 0, 0, 0, 0},{-1, 0, 0,-1, 0, 0},{ 0, 0, 0, 0, 0, 0},{ 0, 0, 0, 0, 0, 0},{ 0,-1, 0, 0,-1, 0},{ 0, 0, 0, 0, 0, 0}};// 起始位置 x:行数 y:列数int x=2,y=5;// 开始寻路pathfind(x-1,y-1,matrix);}}
路径输出
32 31 28 27 26 25-1 30 29 -1 1 2410 9 6 5 2 2311 8 7 4 3 2212 -1 16 17 -1 2113 14 15 18 19 20
JS版本
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>一笔画寻路暴力破解</title></head><body><div id="pathTable"></div></body><script>var unicursal = function () {// 步骤从1开始this.count = 1;this.path = null;this.success = false;this.matrix = null;this.x = null;this.y = null;};unicursal.prototype.run = function () {this.path = this.copyArr(this.matrix);this.pathfind(this.x - 1, this.y - 1, this.path)}unicursal.prototype.copyArr = function (obj) {var out = [];for (var i = 0, len = obj.length; i < len; i++) {if (obj[i] instanceof Array) {out[i] = this.copyArr(obj[i]);} else {out[i] = obj[i];}}return out;}/*** 寻路 每走一步都会有三个方向可以走,如果无路可走,遍历一下是否还有未走的格子* 如果没有,则寻路成功,打印出路径,如果有,则退一步,走其他方向** @param x 起始位置第几行* @param y 起始位置第几列* @param matrix 棋盘数组(0代表可以走的路,-1代表障碍,1,2,3....代表路径)*/unicursal.prototype.pathfind = function (x, y, matrix) {matrix[x][y] = this.count++;// 如果下一步没有超出y的最大边界,并且下一步可以走if (y + 1 < matrix[x].length && matrix[x][y + 1] == 0) {this.pathfind(x, y + 1, matrix);if (this.success) {return}}// 如果下一步没有超出y的最小边界,并且下一步可以走if (y - 1 >= 0 && matrix[x][y - 1] == 0) {this.pathfind(x, y - 1, matrix);if (this.success) {return}}// 如果下一步没有超出x的最大边界,并且下一步可以走if (x + 1 < matrix.length && matrix[x + 1][y] == 0) {this.pathfind(x + 1, y, matrix);if (this.success) {return}}// 如果下一步没有超出x的最小边界,并且下一步可以走if (x - 1 >= 0 && matrix[x - 1][y] == 0) {this.pathfind(x - 1, y, matrix);if (this.success) {return}}// 走到此,说明已经无路可走,遍历一下是否还有未走的格子for (var i = 0; i < matrix.length; i++) {for (var j = 0; j < matrix[i].length; j++) {// 如果有未走的格子,说明寻路失败,退一步继续寻路if (matrix[i][j] == 0) {matrix[x][y] = 0;this.count--;return;}}}this.success = true;}/*** 举个栗子*/// 棋盘数组(0代表可以走的路,-1代表障碍)var matrix = [[0, 0, 0, 0, 0, 0],[-1, 0, 0, -1, 0, 0],[0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0],[0, -1, 0, 0, -1, 0],[0, 0, 0, 0, 0, 0]];var instance = new unicursal();instance.matrix = matrix;// 起始位置 x:行数 y:列数instance.x = 2;instance.y = 5;// 开始寻路instance.run();if (!instance.success) {document.getElementById("pathTable").innerHTML = "无路径可寻";} else {// 走到此,说明没有未走的格子,说明寻路成功,打印输出路径var table = "<table style=\"text-align: right\">";for (var i = 0; i < instance.path.length; i++) {table += "<tr>";for (var j = 0; j < instance.path[i].length; j++) {table += "<td>" + instance.path[i][j] + "</td>";}table += "</tr>";}table += "</table>";document.getElementById("pathTable").innerHTML = table;}</script></html>
