编程暴力破解一笔画游戏。
    github地址:https://github.com/NPCDW/Unicursal
    demo地址:https://npcdw.github.io/Unicursal/

    1. public class Unicursal {
    2. // 步骤从1开始
    3. private static int count = 1;
    4. /**
    5. * 寻路 每走一步都会有三个方向可以走,如果无路可走,遍历一下是否还有未走的格子
    6. * 如果没有,则寻路成功,打印出路径,如果有,则退一步,走其他方向
    7. *
    8. * @param x 起始位置第几行
    9. * @param y 起始位置第几列
    10. * @param matrix 棋盘数组(0代表可以走的路,-1代表障碍,1,2,3....代表路径)
    11. */
    12. private static void pathfind(int x,int y,int[][] matrix){
    13. matrix[x][y] = count++;
    14. // 如果下一步没有超出y的最大边界,并且下一步可以走
    15. if (y+1 < matrix[x].length && matrix[x][y+1]==0){
    16. pathfind(x,y+1,matrix);
    17. }
    18. // 如果下一步没有超出y的最小边界,并且下一步可以走
    19. if (y-1 >= 0 && matrix[x][y-1]==0){
    20. pathfind(x,y-1,matrix);
    21. }
    22. // 如果下一步没有超出x的最大边界,并且下一步可以走
    23. if (x+1 < matrix.length && matrix[x+1][y]==0){
    24. pathfind(x+1,y,matrix);
    25. }
    26. // 如果下一步没有超出x的最小边界,并且下一步可以走
    27. if (x-1 >= 0 && matrix[x-1][y]==0){
    28. pathfind(x-1,y,matrix);
    29. }
    30. // 走到此,说明已经无路可走,遍历一下是否还有未走的格子
    31. for (int i=0;i<matrix.length;i++){
    32. for (int j=0;j<matrix[i].length;j++){
    33. // 如果有未走的格子,说明寻路失败,退一步继续寻路
    34. if (matrix[i][j]==0){
    35. matrix[x][y] = 0;
    36. count--;
    37. return;
    38. }
    39. }
    40. }
    41. // 走到此,说明没有未走的格子,说明寻路成功,打印输出路径
    42. for (int i=0;i<matrix.length;i++){
    43. for (int j=0;j<matrix[i].length;j++){
    44. System.out.print(String.format("%3d", matrix[i][j]));
    45. }
    46. System.out.println();
    47. }
    48. // 退出程序
    49. System.exit(-1);
    50. }
    51. /**
    52. * 举个栗子
    53. */
    54. public static void main(String[] args) {
    55. // 棋盘数组(0代表可以走的路,-1代表障碍)
    56. int[][] matrix = {
    57. { 0, 0, 0, 0, 0, 0},
    58. {-1, 0, 0,-1, 0, 0},
    59. { 0, 0, 0, 0, 0, 0},
    60. { 0, 0, 0, 0, 0, 0},
    61. { 0,-1, 0, 0,-1, 0},
    62. { 0, 0, 0, 0, 0, 0}
    63. };
    64. // 起始位置 x:行数 y:列数
    65. int x=2,y=5;
    66. // 开始寻路
    67. pathfind(x-1,y-1,matrix);
    68. }
    69. }

    路径输出

    1. 32 31 28 27 26 25
    2. -1 30 29 -1 1 24
    3. 10 9 6 5 2 23
    4. 11 8 7 4 3 22
    5. 12 -1 16 17 -1 21
    6. 13 14 15 18 19 20

    JS版本

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>一笔画寻路暴力破解</title>
    8. </head>
    9. <body>
    10. <div id="pathTable"></div>
    11. </body>
    12. <script>
    13. var unicursal = function () {
    14. // 步骤从1开始
    15. this.count = 1;
    16. this.path = null;
    17. this.success = false;
    18. this.matrix = null;
    19. this.x = null;
    20. this.y = null;
    21. };
    22. unicursal.prototype.run = function () {
    23. this.path = this.copyArr(this.matrix);
    24. this.pathfind(this.x - 1, this.y - 1, this.path)
    25. }
    26. unicursal.prototype.copyArr = function (obj) {
    27. var out = [];
    28. for (var i = 0, len = obj.length; i < len; i++) {
    29. if (obj[i] instanceof Array) {
    30. out[i] = this.copyArr(obj[i]);
    31. } else {
    32. out[i] = obj[i];
    33. }
    34. }
    35. return out;
    36. }
    37. /**
    38. * 寻路 每走一步都会有三个方向可以走,如果无路可走,遍历一下是否还有未走的格子
    39. * 如果没有,则寻路成功,打印出路径,如果有,则退一步,走其他方向
    40. *
    41. * @param x 起始位置第几行
    42. * @param y 起始位置第几列
    43. * @param matrix 棋盘数组(0代表可以走的路,-1代表障碍,1,2,3....代表路径)
    44. */
    45. unicursal.prototype.pathfind = function (x, y, matrix) {
    46. matrix[x][y] = this.count++;
    47. // 如果下一步没有超出y的最大边界,并且下一步可以走
    48. if (y + 1 < matrix[x].length && matrix[x][y + 1] == 0) {
    49. this.pathfind(x, y + 1, matrix);
    50. if (this.success) {
    51. return
    52. }
    53. }
    54. // 如果下一步没有超出y的最小边界,并且下一步可以走
    55. if (y - 1 >= 0 && matrix[x][y - 1] == 0) {
    56. this.pathfind(x, y - 1, matrix);
    57. if (this.success) {
    58. return
    59. }
    60. }
    61. // 如果下一步没有超出x的最大边界,并且下一步可以走
    62. if (x + 1 < matrix.length && matrix[x + 1][y] == 0) {
    63. this.pathfind(x + 1, y, matrix);
    64. if (this.success) {
    65. return
    66. }
    67. }
    68. // 如果下一步没有超出x的最小边界,并且下一步可以走
    69. if (x - 1 >= 0 && matrix[x - 1][y] == 0) {
    70. this.pathfind(x - 1, y, matrix);
    71. if (this.success) {
    72. return
    73. }
    74. }
    75. // 走到此,说明已经无路可走,遍历一下是否还有未走的格子
    76. for (var i = 0; i < matrix.length; i++) {
    77. for (var j = 0; j < matrix[i].length; j++) {
    78. // 如果有未走的格子,说明寻路失败,退一步继续寻路
    79. if (matrix[i][j] == 0) {
    80. matrix[x][y] = 0;
    81. this.count--;
    82. return;
    83. }
    84. }
    85. }
    86. this.success = true;
    87. }
    88. /**
    89. * 举个栗子
    90. */
    91. // 棋盘数组(0代表可以走的路,-1代表障碍)
    92. var matrix = [
    93. [0, 0, 0, 0, 0, 0],
    94. [-1, 0, 0, -1, 0, 0],
    95. [0, 0, 0, 0, 0, 0],
    96. [0, 0, 0, 0, 0, 0],
    97. [0, -1, 0, 0, -1, 0],
    98. [0, 0, 0, 0, 0, 0]
    99. ];
    100. var instance = new unicursal();
    101. instance.matrix = matrix;
    102. // 起始位置 x:行数 y:列数
    103. instance.x = 2;
    104. instance.y = 5;
    105. // 开始寻路
    106. instance.run();
    107. if (!instance.success) {
    108. document.getElementById("pathTable").innerHTML = "无路径可寻";
    109. } else {
    110. // 走到此,说明没有未走的格子,说明寻路成功,打印输出路径
    111. var table = "<table style=\"text-align: right\">";
    112. for (var i = 0; i < instance.path.length; i++) {
    113. table += "<tr>";
    114. for (var j = 0; j < instance.path[i].length; j++) {
    115. table += "<td>" + instance.path[i][j] + "</td>";
    116. }
    117. table += "</tr>";
    118. }
    119. table += "</table>";
    120. document.getElementById("pathTable").innerHTML = table;
    121. }
    122. </script>
    123. </html>