zoukankan      html  css  js  c++  java
  • java迷宫


    package 迷宫;

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Point;

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    /**
    *
    * @author Wang Jianxin
    *
    */
    public class MainUI extends JFrame {

    public static int[][] array = new int[DealTool.Rows][DealTool.Columns]; // 创建一个矩阵
    public static int[][] array_2 = new int[DealTool.Rows][DealTool.Columns];// 创建第二个数组用来存放初始数据
    public int i2, j2;

    // 函数重载 得到矩阵数组
    public MainUI(int[][] array) {
    this.array = array;
    this.array_2 = array;
    }

    /**
    * @param args
    */
    public static void main(String[] args) {
    DealTool dt = new DealTool();
    MainUI test = new MainUI(dt.array);
    test.printarray();
    test.FindStart();// 找到迷宫入口坐标

    test.FindPath(); //开始查找路径
    // System.out.println("找到所有点>>>>>>>>>>>>>>>>>>"
    // + DealTool.PointList.size());

    // 画出迷宫
    test.DrawPanel();

    }

    /**
    * 查找迷宫路径的方法
    */
    public void FindPath() {
    try {
    // 得到队列最后一个的point对象
    Point p_end1 = DealTool.PointList
    .get(DealTool.PointList.size() - 1);
    // 得到当前点在数组中的位置 用以查找 8个方向的值
    int i1 = p_end1.y;
    int j1 = p_end1.x;

    if (DealTool.PointList.size() > 1) { // 得到队列中倒数第二个point对象

    Point p_end2 = DealTool.PointList
    .get(DealTool.PointList.size() - 2);
    i2 = p_end2.y;
    j2 = p_end2.x;
    } else {
    i2 = 0;
    j2 = 0;
    }

    /************************* 找到出口的条件 ******************************************/
    if ((i1 == DealTool.Rows - 2) && (j1 == DealTool.Columns - 2)) {
    return;
    }

    /********************* 从3点钟方向逆时针遍历查找周围8个point及其对应数组 *********************/

    if (array[i1][j1 + 1] == 0) {// 向 右 方向找
    Point p = new Point(j1 + 1, i1); //将找到的通路的点对应的下表存入Point对象
    DealTool.PointList.add(p); //再将Point对象存入队列中
    array[i1][j1] = 1; //并将原来的点改为“障碍点”

    System.out.println("<<<<<<<<<<<右>>>>>>>>>>>"+
    DealTool.PointList.get(DealTool.PointList.size() - 1));
    FindPath();
    return;
    }
    if (array[i1 - 1][j1 + 1] == 0) { // 向 右上方向找
    Point p = new Point(j1 + 1, i1 - 1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<右上>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;

    }
    if (array[i1 - 1][j1] == 0) { // 向上方向找
    Point p = new Point(j1, i1 - 1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<上>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;

    }
    if (array[i1 - 1][j1 - 1] == 0) { // 向 左上方向找
    Point p = new Point(j1 - 1, i1 - 1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<左上>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;

    }
    if (array[i1][j1 - 1] == 0) { // 向左方向找

    Point p = new Point(j1 - 1, i1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<左>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;

    }
    if (array[i1 + 1][j1 - 1] == 0) { // 向 左下方向找
    Point p = new Point(j1 - 1, i1 + 1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<左下>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;

    }
    if (array[i1 + 1][j1] == 0) { // 向下方向找

    Point p = new Point(j1, i1 + 1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<下>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;
    }
    if (array[i1 + 1][j1 + 1] == 0) { // 向右下方向找

    Point p = new Point(j1 + 1, i1 + 1);
    DealTool.PointList.add(p);
    array[i1][j1] = 1;

    System.out
    .println("<<<<<<<<<<<右下>>>>>>>>>>>"
    + DealTool.PointList.get(DealTool.PointList
    .size() - 1));
    FindPath();
    return;
    }
    array[i1][j1] = 1; //如果找不到通路点,就将该点改为“路障点”
    array[i2][j2] = 0; //并且使栈中倒数第二个点 “路长点”恢复为“通路点” 方便下一次查找
    DealTool.PointList.remove(DealTool.PointList.size() - 1); //将现在的“路障点”从栈中删除
    System.out.println("删除了一个点 " + " 现在还有"
    + DealTool.PointList.size() + "个点");
    FindPath(); //继续递归
    return;

    } catch (Exception ef) {//异常处理
    JOptionPane.showMessageDialog(null, "该迷宫找不到出路了,请重新启动程序!");
    ef.printStackTrace();
    }

    }

    /**
    * 找到迷宫矩阵入口
    */
    private void FindStart() {
    for (int i = 1; i < DealTool.Rows - 1; i++) {
    for (int j = 1; j < DealTool.Columns - 1; j++) {
    if (array[i][j] == 0) {
    // 存储点的横纵坐标 横坐标为 j 纵坐标为 i
    Point p = new Point(j, i);
    DealTool.PointList.add(p);
    // System.out.println(p.x+" "+p.y);
    return;
    }
    }
    }

    }

    /**
    * 打印矩阵
    */
    public void printarray() {
    // 测试矩阵
    for (int i = 0; i < DealTool.Rows; i++) {
    for (int j = 0; j < DealTool.Columns; j++) {
    System.out.print(array[i][j] + " ");
    }
    System.out.println();
    }
    }

    /**
    * 绘制迷宫图的方法
    */
    public void DrawPanel() {
    this.setTitle("简单迷宫1.0");
    this.setSize(500, 600);
    this.setLayout(new FlowLayout());

    JPanel panel = new NewPanel();
    panel.setLayout(null);
    panel.setName("panel");
    panel.setPreferredSize(new Dimension(450, 550));
    panel.setBackground(Color.LIGHT_GRAY);

    Graphics g = panel.getGraphics(); 
  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3575900.html
Copyright © 2011-2022 走看看