欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現走迷宮回溯算法

 更新時間:2020年05月27日 09:28:25   作者:Shower稻草人  
這篇文章主要為大家詳細介紹了Java實現走迷宮回溯算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

以一個M×N的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計一個程序,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。

(1) 根據二維數組,輸出迷宮的圖形。
(2) 探索迷宮的四個方向:RIGHT為向右,DOWN向下,LEFT向左,UP向上,輸出從入口到出口的行走路徑。

例子:

左上角(1,1)為入口,右下角(8,9)為出口。

可使用回溯方法,即從入口出發(fā),順著某一個方向進行探索,若能走通,則繼續(xù)往前進;否則沿著原路退回,換一個方向繼續(xù)探索,直至出口位置,求得一條通路。假如所有可能的通路都探索到而未能到達出口,則所設定的迷宮沒有通路。

import java.util.*;

class Position{
 public Position(){

 }

 public Position(int row, int col){
  this.col = col;
  this.row = row;
 }

 public String toString(){
  return "(" + row + " ," + col + ")";
 }

 int row;
 int col;
}

class Maze{
 public Maze(){
  maze = new int[15][15];
  stack = new Stack<Position>();
  p = new boolean[15][15];
 }

 /*
  * 構造迷宮
  */
 public void init(){
  Scanner scanner = new Scanner(System.in);
  System.out.println("請輸入迷宮的行數");
  row = scanner.nextInt();
  System.out.println("請輸入迷宮的列數");
  col = scanner.nextInt();
  System.out.println("請輸入" + row + "行" + col + "列的迷宮");
  int temp = 0;
  for(int i = 0; i < row; ++i) {
   for(int j = 0; j < col; ++j) {
    temp = scanner.nextInt();
    maze[i][j] = temp;
    p[i][j] = false;
   }
  }
 }

 /*
  * 回溯迷宮,查看是否有出路
  */
 public void findPath(){
  // 給原始迷宮的周圍家一圈圍墻
  int temp[][] = new int[row + 2][col + 2];
  for(int i = 0; i < row + 2; ++i) {
   for(int j = 0; j < col + 2; ++j) {
    temp[0][j] = 1;
    temp[row + 1][j] = 1;
    temp[i][0] = temp[i][col + 1] = 1;
   }
  }
  // 將原始迷宮復制到新的迷宮中
  for(int i = 0; i < row; ++i) {
   for(int j = 0; j < col; ++j) {
    temp[i + 1][j + 1] = maze[i][j];
   }
  }
  // 從左上角開始按照順時針開始查詢

  int i = 1;
  int j = 1;
  p[i][j] = true;
  stack.push(new Position(i, j));
  while (!stack.empty() && (!(i == (row) && (j == col)))) {

   if ((temp[i][j + 1] == 0) && (p[i][j + 1] == false)) {
    p[i][j + 1] = true;
    stack.push(new Position(i, j + 1));
    j++;
   } else if ((temp[i + 1][j] == 0) && (p[i + 1][j] == false)) {
    p[i + 1][j] = true;
    stack.push(new Position(i + 1, j));
    i++;
   } else if ((temp[i][j - 1] == 0) && (p[i][j - 1] == false)) {
    p[i][j - 1] = true;
    stack.push(new Position(i, j - 1));
    j--;
   } else if ((temp[i - 1][j] == 0) && (p[i - 1][j] == false)) {
    p[i - 1][j] = true;
    stack.push(new Position(i - 1, j));
    i--;
   } else {
    stack.pop();
    if(stack.empty()){
     break;
    }
    i = stack.peek().row;
    j = stack.peek().col;
   }

  }

  Stack<Position> newPos = new Stack<Position>();
  if (stack.empty()) {
   System.out.println("沒有路徑");
  } else {
   System.out.println("有路徑");
   System.out.println("路徑如下:");
   while (!stack.empty()) {
    Position pos = new Position();
    pos = stack.pop();
    newPos.push(pos);
   }
  }

  /*
   * 圖形化輸出路徑
   * */

  String resault[][]=new String[row+1][col+1];
  for(int k=0;k<row;++k){
   for(int t=0;t<col;++t){
    resault[k][t]=(maze[k][t])+"";
   }
  }
  while (!newPos.empty()) {
   Position p1=newPos.pop();
   resault[p1.row-1][p1.col-1]="#";

  }

  for(int k=0;k<row;++k){
   for(int t=0;t<col;++t){
    System.out.print(resault[k][t]+"\t");
   }
   System.out.println();
  }


 }

 int maze[][];
 private int row = 9;
 private int col = 8;
 Stack<Position> stack;
 boolean p[][] = null;
}

class hello{
 public static void main(String[] args){
  Maze demo = new Maze();
  demo.init();
  demo.findPath();
 }
}

運行示例:

請輸入迷宮的行數
3
請輸入迷宮的列數
3
請輸入3行3列的迷宮
0 1 1
0 0 1
1 0 0

有路徑
路徑如下:

請輸入迷宮的行數
9
請輸入迷宮的列數
8
請輸入9行8列的迷宮
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 1 0 1 1 0 1
0 1 1 1 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 1
0 1 1 1 1 0 0 1
1 1 0 0 0 1 0 1
1 1 0 0 0 0 0 0

有路徑
路徑如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java單例模式的幾種常見寫法

    Java單例模式的幾種常見寫法

    這篇文章主要介紹了Java單例模式的幾種寫法,單例模式是面試中的??土耍R妼懛ㄓ?4?種:餓漢模式、懶漢模式、靜態(tài)內部類和枚舉,接下來我們一起進入文章看看吧
    2022-05-05
  • java數組復制的四種方法效率對比

    java數組復制的四種方法效率對比

    這篇文章主要介紹了java數組復制的四種方法效率對比,文中有簡單的代碼示例,以及效率的比較結果,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java WebSocket客戶端接收大量數據的三種方案

    Java WebSocket客戶端接收大量數據的三種方案

    WebSocket是一種基于TCP協議的全雙工通信協議,它能夠在客戶端和服務器之間建立一個持久連接,實現實時的雙向數據傳輸,在實際應用中,有時候我們需要處理大量的數據,所以本文將介紹如何使用 Java WebSocket 客戶端接收大量數據,并提供一些優(yōu)化方案
    2023-11-11
  • Java 遍歷取出Map集合key-value數據的4種方法

    Java 遍歷取出Map集合key-value數據的4種方法

    這篇文章主要介紹了Java 遍歷取出Map集合key-value數據的4種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • EasyExcel工具讀取Excel空數據行問題的解決辦法

    EasyExcel工具讀取Excel空數據行問題的解決辦法

    EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單,節(jié)省內存著稱,下面這篇文章主要給大家介紹了關于EasyExcel工具讀取Excel空數據行問題的解決辦法,需要的朋友可以參考下
    2022-08-08
  • Java設計模式之23種設計模式詳解

    Java設計模式之23種設計模式詳解

    這篇文章主要介紹了Java設計模式之23種設計模式詳解,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,項目中合理的運用設計模式可以完美的解決很多問題,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java中Json與List、Map、entity的互相轉化

    Java中Json與List、Map、entity的互相轉化

    在開發(fā)中,Json轉換的場景往往也就是那么幾個,本文主要介紹了Java中Json與List、Map、entity的互相轉化,具有一定的參考價值,感興趣的可以了解一下
    2022-07-07
  • Java中IO流概述

    Java中IO流概述

    大家好,本篇文章主要講的是Java中IO流概述,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • SpringBoot Session接口驗證實現流程詳解

    SpringBoot Session接口驗證實現流程詳解

    這篇文章主要介紹了SpringBoot+Session實現接口驗證(過濾器+攔截器)文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • java實現字符串轉String數組的方法示例

    java實現字符串轉String數組的方法示例

    這篇文章主要介紹了java實現字符串轉String數組的方法,涉及java字符串的遍歷、分割、轉換等相關操作技巧,需要的朋友可以參考下
    2017-10-10

最新評論