();
37 | Position entrance = new Position(data.getEntranceX(), data.getEntranceY());
38 | queue.addLast(entrance);
39 | data.visited[entrance.getX()][entrance.getY()] = true;
40 |
41 | boolean isSolved = false;
42 |
43 | while(queue.size() != 0){
44 | Position curPos = queue.pop();
45 | setData(curPos.getX(), curPos.getY(), true);
46 |
47 | if(curPos.getX() == data.getExitX() && curPos.getY() == data.getExitY()){
48 | isSolved = true;
49 | findPath(curPos);
50 | break;
51 | }
52 |
53 | for(int i = 0 ; i < 4 ; i ++){
54 | int newX = curPos.getX() + d[i][0];
55 | int newY = curPos.getY() + d[i][1];
56 |
57 | if(data.inArea(newX, newY)
58 | && !data.visited[newX][newY]
59 | && data.getMaze(newX, newY) == MazeData.ROAD){
60 | queue.addLast(new Position(newX, newY, curPos));
61 | data.visited[newX][newY] = true;
62 | }
63 | }
64 |
65 | }
66 |
67 | if(!isSolved)
68 | System.out.println("The maze has no Solution!");
69 |
70 | setData(-1, -1, false);
71 | }
72 |
73 | private void findPath(Position des){
74 |
75 | Position cur = des;
76 | while(cur != null){
77 | data.result[cur.getX()][cur.getY()] = true;
78 | cur = cur.getPrev();
79 | }
80 | }
81 |
82 | private void setData(int x, int y, boolean isPath){
83 | if(data.inArea(x, y))
84 | data.path[x][y] = isPath;
85 |
86 | frame.render(data);
87 | AlgoVisHelper.pause(DELAY);
88 | }
89 |
90 | /*public static void main(String[] args) {
91 |
92 | String mazeFile = "src/maze_101_101.txt";
93 |
94 | AlgoVisualizer vis = new AlgoVisualizer(mazeFile);
95 | }*/
96 | }
--------------------------------------------------------------------------------
/src/sample/MazeBFS/MazeData.java:
--------------------------------------------------------------------------------
1 | package sample.MazeBFS;
2 |
3 | import java.io.BufferedInputStream;
4 | import java.io.File;
5 | import java.io.FileInputStream;
6 | import java.io.IOException;
7 | import java.util.Scanner;
8 |
9 |
10 | public class MazeData {
11 |
12 | public static final char ROAD = 'O';
13 | public static final char WALL = '#';
14 |
15 | private int entranceX, entranceY;
16 | private int exitX, exitY;
17 |
18 | private int N, M;
19 | private char[][] maze;
20 | public boolean[][] path;
21 | public boolean[][] visited;
22 | public boolean[][] result;
23 |
24 | public MazeData(String filename){
25 |
26 | if(filename == null)
27 | throw new IllegalArgumentException("Filename can not be null!");
28 |
29 | Scanner scanner = null;
30 | try{
31 | File file = new File(filename);
32 | if(!file.exists())
33 | throw new IllegalArgumentException("File " + filename + " doesn't exist");
34 |
35 | FileInputStream fis = new FileInputStream(file);
36 | scanner = new Scanner(new BufferedInputStream(fis), "UTF-8");
37 |
38 | // 读取第一行
39 | String nmline = scanner.nextLine();
40 | String[] nm = nmline.trim().split("\\s+");
41 | //System.out.print(nm[0] + ' ' + nm[1]);
42 |
43 | N = Integer.parseInt(nm[0]);
44 | // System.out.println("N = " + N);
45 | M = Integer.parseInt(nm[1]);
46 | // System.out.println("M = " + M);
47 |
48 | // 读取后续的N行
49 | visited = new boolean[N][M];
50 | path = new boolean[N][M];
51 | result = new boolean[N][M];
52 | maze = new char[N][M];
53 | for(int i = 0 ; i < N ; i ++){
54 | String line = scanner.nextLine();
55 |
56 | // 每行保证有M个字符
57 | if(line.length() != M)
58 | throw new IllegalArgumentException("Maze file " + filename + " is invalid");
59 | for(int j = 0 ; j < M ; j ++){
60 | maze[i][j] = line.charAt(j);
61 | visited[i][j] = false;
62 | path[i][j] = false;
63 | result[i][j] = false;
64 | }
65 | }
66 | }
67 | catch(IOException e){
68 | e.printStackTrace();
69 | }
70 | finally {
71 | if(scanner != null)
72 | scanner.close();
73 | }
74 |
75 | entranceX = 1;
76 | entranceY = 0;
77 | exitX = N - 2;
78 | exitY = M - 1;
79 | }
80 |
81 | public int N(){ return N; }
82 | public int M(){ return M; }
83 | public int getEntranceX(){return entranceX;}
84 | public int getEntranceY(){return entranceY;}
85 | public int getExitX(){return exitX;}
86 | public int getExitY(){return exitY;}
87 | public char getMaze(int i, int j){
88 | if(!inArea(i,j))
89 | throw new IllegalArgumentException("i or j is out of index in getMaze!");
90 | return maze[i][j];
91 | }
92 |
93 | public boolean inArea(int x, int y){
94 | return x >= 0 && x < N && y >= 0 && y < M;
95 | }
96 |
97 | public void print(){
98 | System.out.println(N + " " + M);
99 | for(int i = 0 ; i < N ; i ++){
100 | for(int j = 0 ; j < M ; j ++)
101 | System.out.print(maze[i][j]);
102 | System.out.println();
103 | }
104 | return;
105 | }
106 |
107 | }
--------------------------------------------------------------------------------
/src/sample/MazeBFS/Position.java:
--------------------------------------------------------------------------------
1 | package sample.MazeBFS;
2 |
3 | public class Position {
4 |
5 | private int x, y;
6 | private Position prev;
7 |
8 | public Position(int x, int y, Position prev){
9 | this.x = x;
10 | this.y = y;
11 | this.prev = prev;
12 | }
13 |
14 | public Position(int x, int y){
15 | this(x, y, null);
16 | }
17 |
18 | public int getX(){return x;}
19 | public int getY(){return y;}
20 | public Position getPrev(){return prev;}
21 | }
22 |
--------------------------------------------------------------------------------
/src/sample/MazeDFS/AlgoFrame.java:
--------------------------------------------------------------------------------
1 | package sample.MazeDFS;
2 |
3 | import javax.swing.*;
4 | import java.awt.*;
5 |
6 | public class AlgoFrame extends JFrame{
7 |
8 | private int canvasWidth;
9 | private int canvasHeight;
10 |
11 | public AlgoFrame(String title, int canvasWidth, int canvasHeight){
12 |
13 | super(title);
14 |
15 | this.canvasWidth = canvasWidth;
16 | this.canvasHeight = canvasHeight;
17 |
18 | AlgoCanvas canvas = new AlgoCanvas();
19 | setContentPane(canvas);
20 | pack();
21 |
22 | /*setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*/
23 | setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
24 | setResizable(false);
25 | setBounds(400,100,canvasWidth+20,canvasHeight+50);
26 | setVisible(true);
27 | }
28 |
29 | public AlgoFrame(String title){
30 |
31 | this(title, 1024, 768);
32 | }
33 |
34 | public int getCanvasWidth(){return canvasWidth;}
35 | public int getCanvasHeight(){return canvasHeight;}
36 |
37 | // data
38 | private MazeData data;
39 | public void render(MazeData data){
40 | this.data = data;
41 | repaint();
42 | }
43 |
44 | private class AlgoCanvas extends JPanel{
45 |
46 | public AlgoCanvas(){
47 | // 双缓存
48 | super(true);
49 | }
50 |
51 | @Override
52 | public void paintComponent(Graphics g) {
53 | super.paintComponent(g);
54 |
55 | Graphics2D g2d = (Graphics2D)g;
56 |
57 | // 抗锯齿
58 | // RenderingHints hints = new RenderingHints(
59 | // RenderingHints.KEY_ANTIALIASING,
60 | // RenderingHints.VALUE_ANTIALIAS_ON);
61 | // hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
62 | // g2d.addRenderingHints(hints);
63 |
64 | // 具体绘制
65 | int w = canvasWidth/data.M();
66 | int h = canvasHeight/data.N();
67 |
68 | for(int i = 0 ; i < data.N() ; i ++ ) {
69 | for (int j = 0; j < data.M(); j++) {
70 | if (data.getMaze(i, j) == MazeData.WALL)
71 | AlgoVisHelper.setColor(g2d, AlgoVisHelper.LightBlue);
72 | else
73 | AlgoVisHelper.setColor(g2d, AlgoVisHelper.White);
74 |
75 | if (data.path[i][j])
76 | AlgoVisHelper.setColor(g2d, AlgoVisHelper.Yellow);
77 |
78 | AlgoVisHelper.fillRectangle(g2d, j * w, i * h, w, h);
79 | }
80 | }
81 | }
82 |
83 | @Override
84 | public Dimension getPreferredSize(){
85 | return new Dimension(canvasWidth, canvasHeight);
86 | }
87 | }
88 | }
--------------------------------------------------------------------------------
/src/sample/MazeDFS/AlgoVisHelper.java:
--------------------------------------------------------------------------------
1 | package sample.MazeDFS;
2 |
3 | import java.awt.*;
4 | import java.awt.geom.Ellipse2D;
5 |
6 | import java.awt.geom.Rectangle2D;
7 | import java.lang.InterruptedException;
8 |
9 |
10 | public class AlgoVisHelper {
11 |
12 | private AlgoVisHelper(){}
13 |
14 | public static final Color Red = new Color(0xF44336);
15 | public static final Color Pink = new Color(0xE91E63);
16 | public static final Color Purple = new Color(0x9C27B0);
17 | public static final Color DeepPurple = new Color(0x673AB7);
18 | public static final Color Indigo = new Color(0x3F51B5);
19 | public static final Color Blue = new Color(0x2196F3);
20 | public static final Color LightBlue = new Color(0x03A9F4);
21 | public static final Color Cyan = new Color(0x00BCD4);
22 | public static final Color Teal = new Color(0x009688);
23 | public static final Color Green = new Color(0x4CAF50);
24 | public static final Color LightGreen = new Color(0x8BC34A);
25 | public static final Color Lime = new Color(0xCDDC39);
26 | public static final Color Yellow = new Color(0xFFEB3B);
27 | public static final Color Amber = new Color(0xFFC107);
28 | public static final Color Orange = new Color(0xFF9800);
29 | public static final Color DeepOrange = new Color(0xFF5722);
30 | public static final Color Brown = new Color(0x795548);
31 | public static final Color Grey = new Color(0x9E9E9E);
32 | public static final Color BlueGrey = new Color(0x607D8B);
33 | public static final Color Black = new Color(0x000000);
34 | public static final Color White = new Color(0xFFFFFF);
35 |
36 |
37 | public static void strokeCircle(Graphics2D g, int x, int y, int r){
38 |
39 | Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
40 | g.draw(circle);
41 | }
42 |
43 | public static void fillCircle(Graphics2D g, int x, int y, int r){
44 |
45 | Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
46 | g.fill(circle);
47 | }
48 |
49 | public static void strokeRectangle(Graphics2D g, int x, int y, int w, int h){
50 |
51 | Rectangle2D rectangle = new Rectangle2D.Double(x, y, w, h);
52 | g.draw(rectangle);
53 | }
54 |
55 | public static void fillRectangle(Graphics2D g, int x, int y, int w, int h){
56 |
57 | Rectangle2D rectangle = new Rectangle2D.Double(x, y, w, h);
58 | g.fill(rectangle);
59 | }
60 |
61 | public static void setColor(Graphics2D g, Color color){
62 | g.setColor(color);
63 | }
64 |
65 | public static void setStrokeWidth(Graphics2D g, int w){
66 | int strokeWidth = w;
67 | g.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
68 | }
69 |
70 | public static void pause(int t) {
71 | try {
72 | Thread.sleep(t);
73 | }
74 | catch (InterruptedException e) {
75 | System.out.println("Error sleeping");
76 | }
77 | }
78 |
79 | }
80 |
--------------------------------------------------------------------------------
/src/sample/MazeDFS/AlgoVisualizer.java:
--------------------------------------------------------------------------------
1 | package sample.MazeDFS;
2 |
3 | import java.awt.*;
4 |
5 | public class AlgoVisualizer {
6 |
7 | private static int DELAY = 5;
8 | private static int blockSide = 8;
9 |
10 | private MazeData data;
11 | private AlgoFrame frame;
12 | private static final int d[][] = {{-1,0},{0,1},{1,0},{0,-1}};
13 |
14 | public AlgoVisualizer(String mazeFile,int side){
15 |
16 | // 初始化数据
17 | data = new MazeData(mazeFile);
18 | int sceneHeight = data.N() * side;
19 | int sceneWidth = data.M() * side;
20 |
21 | // 初始化视图
22 | EventQueue.invokeLater(() -> {
23 | frame = new AlgoFrame("迷宫深度优先搜索可视化", sceneWidth, sceneHeight);
24 |
25 | new Thread(() -> {
26 | run();
27 | }).start();
28 | });
29 | }
30 |
31 | public void run(){
32 |
33 | setData(-1, -1, false);
34 |
35 | if(!go(data.getEntranceX(), data.getEntranceY()))
36 | System.out.println("The maze has NO solution!");
37 |
38 | setData(-1, -1, false);
39 | }
40 |
41 | // 从(x,y)的位置开始求解迷宫,如果求解成功,返回true;否则返回false
42 | private boolean go(int x, int y){
43 |
44 | if(!data.inArea(x,y))
45 | throw new IllegalArgumentException("x,y are out of index in go function!");
46 |
47 | data.visited[x][y] = true;
48 | setData(x, y, true);
49 |
50 | if(x == data.getExitX() && y == data.getExitY())
51 | return true;
52 |
53 | for(int i = 0 ; i < 4 ; i ++){
54 | int newX = x + d[i][0];
55 | int newY = y + d[i][1];
56 | if(data.inArea(newX, newY) &&
57 | data.getMaze(newX,newY) == MazeData.ROAD &&
58 | !data.visited[newX][newY])
59 | if(go(newX, newY))
60 | return true;
61 | }
62 |
63 | // 回溯
64 | setData(x, y, false);
65 |
66 | return false;
67 | }
68 |
69 | private void setData(int x, int y, boolean isPath){
70 | if(data.inArea(x, y))
71 | data.path[x][y] = isPath;
72 |
73 | frame.render(data);
74 | AlgoVisHelper.pause(DELAY);
75 | }
76 |
77 | /*public static void main(String[] args) {
78 |
79 | String mazeFile = "src/sample/MazeDFS/maze_101_101.txt";
80 |
81 | AlgoVisualizer vis = new AlgoVisualizer(mazeFile);
82 | }*/
83 | }
--------------------------------------------------------------------------------
/src/sample/MazeDFS/MazeData.java:
--------------------------------------------------------------------------------
1 | package sample.MazeDFS;
2 |
3 | import java.io.BufferedInputStream;
4 | import java.io.File;
5 | import java.io.FileInputStream;
6 | import java.io.IOException;
7 | import java.util.Scanner;
8 |
9 |
10 | public class MazeData {
11 |
12 | public static final char ROAD = 'O';
13 | public static final char WALL = '#';
14 |
15 | private int entranceX, entranceY;
16 | private int exitX, exitY;
17 |
18 | private int N, M;
19 | private char[][] maze;
20 | public boolean[][] path;
21 | public boolean[][] visited;
22 |
23 | public MazeData(String filename){
24 |
25 | if(filename == null)
26 | throw new IllegalArgumentException("Filename can not be null!");
27 |
28 | Scanner scanner = null;
29 | try{
30 | File file = new File(filename);
31 | if(!file.exists())
32 | throw new IllegalArgumentException("File " + filename + " doesn't exist");
33 |
34 | FileInputStream fis = new FileInputStream(file);
35 | scanner = new Scanner(new BufferedInputStream(fis), "UTF-8");
36 |
37 | // 读取第一行
38 | String nmline = scanner.nextLine();
39 | String[] nm = nmline.trim().split("\\s+");
40 | //System.out.print(nm[0] + ' ' + nm[1]);
41 |
42 | N = Integer.parseInt(nm[0]);
43 | // System.out.println("N = " + N);
44 | M = Integer.parseInt(nm[1]);
45 | // System.out.println("M = " + M);
46 |
47 | // 读取后续的N行
48 | visited = new boolean[N][M];
49 | path = new boolean[N][M];
50 | maze = new char[N][M];
51 | for(int i = 0 ; i < N ; i ++){
52 | String line = scanner.nextLine();
53 |
54 | // 每行保证有M个字符
55 | if(line.length() != M)
56 | throw new IllegalArgumentException("Maze file " + filename + " is invalid");
57 | for(int j = 0 ; j < M ; j ++)
58 | maze[i][j] = line.charAt(j);
59 | }
60 | }
61 | catch(IOException e){
62 | e.printStackTrace();
63 | }
64 | finally {
65 | if(scanner != null)
66 | scanner.close();
67 | }
68 |
69 | entranceX = 1;
70 | entranceY = 0;
71 | exitX = N - 2;
72 | exitY = M - 1;
73 | }
74 |
75 | public int N(){ return N; }
76 | public int M(){ return M; }
77 | public int getEntranceX(){return entranceX;}
78 | public int getEntranceY(){return entranceY;}
79 | public int getExitX(){return exitX;}
80 | public int getExitY(){return exitY;}
81 | public char getMaze(int i, int j){
82 | if(!inArea(i,j))
83 | throw new IllegalArgumentException("i or j is out of index in getMaze!");
84 | return maze[i][j];
85 | }
86 |
87 | public boolean inArea(int x, int y){
88 | return x >= 0 && x < N && y >= 0 && y < M;
89 | }
90 |
91 | public void print(){
92 | System.out.println(N + " " + M);
93 | for(int i = 0 ; i < N ; i ++){
94 | for(int j = 0 ; j < M ; j ++)
95 | System.out.print(maze[i][j]);
96 | System.out.println();
97 | }
98 | return;
99 | }
100 |
101 | }
--------------------------------------------------------------------------------
/src/sample/MazePath/Maze.java:
--------------------------------------------------------------------------------
1 | package sample.MazePath;
2 |
3 | import javafx.fxml.FXMLLoader;
4 | import javafx.scene.Parent;
5 | import javafx.scene.Scene;
6 | import javafx.stage.Stage;
7 |
8 | public class Maze {
9 | private String filename = "src/sample/MazePath/maze_101_101.txt";
10 | private int blockside = 8;
11 | private String amethod = "DFS";
12 | public void start(Stage primaryStage) throws Exception {
13 | Parent root = FXMLLoader.load(getClass().getResource("/sample/MazePath/maze.fxml"));
14 | primaryStage.setTitle("迷宫寻路");
15 | primaryStage.setScene(new Scene(root));
16 | primaryStage.show();
17 | primaryStage.setResizable(false);
18 | }
19 |
20 | public void sizesmall(){
21 | filename = "src/sample/MazePath/maze_30_30.txt";
22 | blockside = 20;
23 | }
24 | public void sizemid(){
25 | filename = "src/sample/MazePath/maze_50_101.txt";
26 | blockside = 12;
27 | }
28 | public void sizelarge(){
29 | filename = "src/sample/MazePath/maze_101_101.txt";
30 | blockside = 8;
31 | }
32 |
33 | public void deepsearch(){
34 | amethod = "DFS";
35 | }
36 | public void boardsearch(){
37 | amethod = "BFS";
38 | }
39 |
40 | public void clickok(){
41 | if(amethod == "DFS"){
42 | sample.MazeDFS.AlgoVisualizer vis = new sample.MazeDFS.AlgoVisualizer(filename,blockside);
43 | }
44 | else if(amethod == "BFS"){
45 | sample.MazeBFS.AlgoVisualizer vis = new sample.MazeBFS.AlgoVisualizer(filename,blockside);
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/sample/MazePath/maze.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/sample/MazePath/maze_30_30.txt:
--------------------------------------------------------------------------------
1 | 29 31
2 | ###############################
3 | OOOO###O###O###O#O#O#O###O#O#O#
4 | #OOOOOOO#OOOOO#O#O#O#OOO#O#O#O#
5 | #######O###O#O###O#######O#####
6 | #OOOOOOOOOOO#O#OOOOO#OOO#OOOOO#
7 | #######O###O#O###O###O###O#O###
8 | #OOO#OOOOO#O#O#OOOOOOOOO#O#O#O#
9 | ###O###O#########O#O#O#######O#
10 | #OOOOOOOOOOOOOOOOO#O#OOOOOOO#O#
11 | #####O#O#O#O#O###O#O#O#####O#O#
12 | #OOOOO#O#O#O#OOO#O#O#OOOOO#O#O#
13 | #OOOOO#O#O#OOOOOOO#O#O#O#O#O#O#
14 | #O#O###O###O#O#####O###O#O#O###
15 | #O#O#OOO#OOO#OOOOO#OOOOOOOOO#O#
16 | #O#########O#O#####O#O#O#O#####
17 | #O#OOOOOOOOO#OOOOO#O#O#O#OOOOO#
18 | ###O#O###O#O#O#######O#O#O#O###
19 | #OOO#O#OOO#O#OOOOO#O#O#O#O#OOO#
20 | ###O#########O#####O###O###O#O#
21 | #OOO#OOOOOOOOOOOOOOOOO#O#OOO#O#
22 | #############O###O#O#O#O###O#O#
23 | #OOOOOOOOOOOOOOO#O#O#O#OOO#O#O#
24 | ###O#O#####O#O#O#O#####O###O#O#
25 | #OOO#O#O#OOO#O#O#O#O#OOO#O#O#O#
26 | ####O#O#######OO#O###O#O#####O#
27 | #OOOOO#OOO#OOOOO#O#OOO#OOOOO#O#
28 | #OO##OOOOO#O#O###O###O#O#O#O#O#
29 | #OOO#O#O#OOO#OOOOO#OOO#O#O#O#OO
30 | ###############################
--------------------------------------------------------------------------------
/src/sample/MazePath/maze_50_101.txt:
--------------------------------------------------------------------------------
1 | 50 101
2 | #####################################################################################################
3 | OOOO###O###O###O#O#O#O###O#O#O#O###O#O#O#O#######O#O#O#O#O#O###########O#O#O#O###O#O###O###O#####O#O#
4 | #OOOOOOO#OOOOO#O#O#O#OOO#O#O#O#O#OOO#O#O#OOOOOOOOO#OOO#O#OOOOOOO#OOOOO#O#O#O#OOO#O#OOOOOOO#OOO#OOO#O#
5 | #######O###O#O###O#######O#####O#O#O#O###O#O#O#####O###O#OOOOOOOOO#######O#O#O###O#O#O#O###########O#
6 | #OOOOOOOOOOO#O#OOOOO#OOO#OOOOO#O#O#O#O#OOO#OOOOOOOOOOO#OOOOO#O#OOOOO#OOO#O#O#OOO#O#O#O#OOOOO#OOO#O#O#
7 | #######O###O#O###O###O###O#O#######O#O#O#O#O#O#O###O###O#####O#O#####O#######O###O#O#O#O#######O#O###
8 | #OOO#OOOOO#O#O#OOOOOOOOO#O#O#OOO#OOO#O#O#O#O#O#OOO#O#OOOOOOOOOOOOOOO#O#O#OOO#OOO#O#O#O#OOO#O#O#OOOOO#
9 | ###O###O#########O#O#O#######O#####O#O#O#O#####O#####O###O#O#O#O#####O#O#O###O#########O###O#O#O#####
10 | #OOOOOOOOOOOOOOOOO#O#OOOOOOO#OOO#OOO#O#O#O#OOOOOOOOOOOOO#O#O#O#OOO#OOOOOOOOO#OOO#O#O#O#OOOOOOO#OOOOO#
11 | #####O#O#O#O#O###O#O#O#####O#O#####O#####O###O#O###O#O#######O#####O###O#O#######O#O#O###O#####O#####
12 | #OOOOO#O#O#O#OOO#O#O#OOOOO#O#O#OOO#O#OOOOOOO#O#OOO#O#OOOOOOO#OOOOOOOOO#O#OOOOO#OOO#OOOOO#O#O#O#OOOOO#
13 | #####O#######O#O###O#O#####O#O#O#######O#O#O###O###O#O###O###O###O#O#######O#####O#O#######O#O#O###O#
14 | #OOOOOOOOO#OOO#OOOOO#OOOOOOOOOOOOOOOOO#O#O#O#OOOOO#O#OOO#OOO#OOO#O#O#O#O#O#OOO#O#O#OOO#O#O#OOOOOOO#O#
15 | #O#O#O#O#####O#######O###O#O#O#O###O###O#O#O#O#O#O###################O#O#O#####O#O#O###O#O#O#########
16 | #O#O#O#OOOOO#OOOOO#OOOOO#O#O#O#OOO#OOO#O#O#O#OOO#OOOOO#O#OOOOOOOOOOO#O#O#O#O#O#O#OOOOOOOOOOOOO#O#OOO#
17 | #O#####O#####O#####O#O#O###O###O###########O#OOO#O#O###O#O###O#O#####O#O#O#O#O#O#O#######O#####O#O###
18 | #O#OOOOOOOOO#OOOOO#O#OOOOO#OOO#OOOOO#OOOOO#O#O#O#O#OOOOOOOOO#O#OOOOOOOOOOO#OOOOOOOOOOOOO#OOOOOOOOOOO#
19 | #O#####O#O###########O#O#O#O#O#O#####O###O#O###O#O#O#O#O#########O#O#O#O###O###O#O###O###O###O#O#####
20 | #O#O#OOO#OOOOOOOOOOO#O#O#O#O#O#OOOOOOOOO#O#O#OOO#O#O#O#OOOOOOOOO#O#O#O#OOOOOOO#O#OOO#O#OOOOO#O#OOOOO#
21 | ###O###O#O###O#O#############O#O#O#O###########O#O###O#O#O###O#####O#O#O#O#O#####O###O###O#####O#####
22 | #OOOOOOO#OOO#O#OOOOOOOOOOOOO#O#O#O#OOO#O#OOOOOOO#O#OOO#O#OOO#OOOOO#O#O#O#O#OOOOO#OOO#O#O#O#O#O#OOO#O#
23 | ###O#O#O#O#O###O#O#O#O#####O###O###O###O#O#####O#####O#O#O#O###############O#O#########O###O#O#####O#
24 | #OOO#O#O#O#OOO#O#O#O#OOOOO#OOO#OOO#OOOOOOOOOOO#OOOOOOO#O#O#OOOOOOOOOOO#OOOOO#O#O#O#O#O#OOOOOOOOOOOOO#
25 | #O#O###O###########O#O#O###########O#O#O#O#O#O#####O#O#OOOOO#####O#######O#O###O#O#O#O###O###O#####O#
26 | #O#O#OOOOOOOOO#O#O#O#O#OOOOOOOOOOO#O#O#O#O#O#OOO#OOO#O#OOO#OOOOO#OOOOO#OOO#OOOOOOOOOOO#O#OOO#O#OOO#O#
27 | #O#O###O###O###O#O#####O#O#O#O#####O#O###O###O###O#O#O#O#####O#O#O#O#####O#O###O#O#####O#O#####O#####
28 | #O#O#OOOOO#O#OOOOOOO#OOO#O#O#OOOOO#O#OOO#OOO#O#OOO#O#O#OOOOO#O#O#O#OOOOOOO#OOO#O#OOOOOOOOOOOOOOOOO#O#
29 | #O#####O#####O###O#####O#####O#####O#####O#O#O###O###O#O#O#######O#O#####O#O#O#####O###O#O#O#O#####O#
30 | #O#OOOOOOOOOOOOO#OOOOO#OOO#OOOOOOO#OOOOO#O#O#O#OOOOO#O#O#OOOOO#OOO#OOOOO#OOOOOOOOO#OOO#O#O#O#OOOOOOO#
31 | #O#O#O#O#O#O#O###O#O#####O#O#O#O###O#######O#O#O#O#O#O###O#######O#O#########O#O#O#O###O#####O#O#O#O#
32 | #O#O#O#O#O#O#OOO#O#OOOOO#O#O#O#OOO#OOOOOOO#O#O#O#O#O#O#OOOOOOO#OOO#OOOOO#O#OOO#O#O#OOO#OOOOO#O#O#O#O#
33 | #####O#O#O#O#######O#O#########O###O#######O#O#O#########O#O#O###O#######O###O#O#########O###########
34 | #OOOOO#O#O#OOOOOOO#O#O#O#O#O#OOOOO#OOOOO#O#O#O#OOOOOOO#OOO#O#O#OOOOOOOOOOOOO#O#OOOOOOOOO#OOOOO#O#OOO#
35 | #O#O###O###O#O#####O###O#O#O###O#########O#####O#O#O#####O#######O#O###O#O#####O#O###O###O#O###O#O###
36 | #O#O#OOO#OOO#OOOOO#OOOOOOOOO#OOOOOOOOOOOOOOOOO#O#O#OOO#OOOOOOO#OOO#OOO#O#OOO#OOO#OOO#OOO#O#OOOOOOOOO#
37 | #O#########O#O#####O#O#O#O#####O#O###O#######O#O#O#O#####O#O#######O#####O###O#O#O###O###O#O#O#O#O###
38 | #O#OOOOOOOOO#OOOOO#O#O#O#OOOOO#O#OOO#OOOOOOO#OOOOOOOOO#OOO#O#OOOOOOOOOOO#OOO#O#O#O#O#OOO#O#O#O#O#OOO#
39 | ###O#O###O#O#O#######O#O#O#O#########O#############O#####O#O#######O#####O#O###O###O#########O#O#O#O#
40 | #OOO#O#OOO#O#OOOOO#O#O#O#O#OOOOOOOOOOOOOOOOOOO#O#OOOOOOO#O#OOO#OOOOOOOOO#O#O#OOOOOOOOOOOOO#OOO#O#O#O#
41 | ###O#########O#####O###O###O#O#O###O#O#########O###O#O#O###O#O###O#O#O###O#O###O#O#O#########O#######
42 | #OOO#OOOOOOOOOOOOOOOOO#O#OOO#O#OOO#O#OOOOOOO#OOOOOOO#O#OOO#O#O#OOO#O#OOO#O#O#OOO#O#OOOOOOOOO#OOOOOOO#
43 | #############O###O#O#O#O###O#O#O#O###O###O#####O###################O#####O#O###O###O###O#O###O#O#O#O#
44 | #OOOOOOOOOOOOOOO#O#O#O#OOO#O#O#O#OOO#OOO#OOO#O#OOO#OOO#O#O#O#OOOOOOOOOOO#O#O#OOOOO#OOO#O#OOO#O#O#O#O#
45 | ###O#O#####O#O#O#O#####O###O#O#O#O#O#O#######O#O###O###O#O#O###O#O#O#O#####O#O#O###O#O#O#O#O###O#O#O#
46 | #OOO#O#OOOOO#O#O#O#O#O#O#OOO#O#O#O#O#OOOOOOOOOOOOOOOOOOOOOOOOO#O#O#O#OOOOO#O#O#OOO#O#O#O#O#OOO#O#O#O#
47 | ###O#####O#O#O#####O#O#####O#O###O#O#O#O#O#O#O#O###O#O#O#O#O#####O#O#O#O#######O#O#####O###O#O#####O#
48 | #OOO#OOOOO#O#OOOOOOOOOOOOO#O#OOO#O#O#O#O#O#O#O#OOO#O#O#O#O#OOOOO#O#O#O#OOOOO#OOO#OOOOO#O#OOO#OOOOO#O#
49 | ###O#O#O#O###O#######O###O#O#O#####O#####O#O###O#######O#O#O#O#O###O#O#O#O#####O#O#O###O###O#O#O#O#O#
50 | #OOO#O#O#O#OOOOOOOOO#OOO#O#O#OOOOO#OOOOO#O#O#OOOOOOOOO#O#O#O#O#OOO#O#O#O#OOO#OOO#O#OOO#O#OOO#O#O#O#OO
51 | #####################################################################################################
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/GYBRJ/about.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 关于本软件
6 |
7 |
8 | 本软件由西北农林科技大学信息工程学院方辉毕业设计所做
9 | 制作本软件的目的在于让学生更好的学习数据结构和算法
10 | 主要功能如下:
11 | 树结构可视化
12 |
13 | - 树
14 | - 二叉树
15 | - 线索二叉树
16 | - 森林
17 |
18 | 树结构及算法可视化
19 |
20 | - 堆排序
21 | - B-/B+树
22 | - 二叉排序树
23 | - 红黑树
24 |
25 | 排序算法可视化
26 |
27 | - 冒泡排序
28 | - 选择排序
29 | - 直接插入排序
30 | - 快速排序
31 | - 基数排序
32 | - 希尔排序
33 | - 堆排序
34 | - 归并排序
35 | - 排序算法的比较
36 |
37 | 其他算法可视化
38 |
39 | - 电线布线
40 | - 喷漆机器人
41 | - 迷宫寻路-深度优先搜索
42 | - 迷宫寻路-广度优先搜索
43 |
44 | 对于B-/B+树的实现,参考了David Galles(旧金山大学)网址是https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
45 | 代码地址:
46 | https://github.com/fanghuiX/JavaFXTest
47 | 作者联系方式:fanghuiplus@163.com
48 |
49 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/BT.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 二叉树
6 |
16 |
17 |
18 |
23 |
24 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/BTree.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | B-/B+树
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/Gnjs.java:
--------------------------------------------------------------------------------
1 | package sample.MenuItemEvent.SJGJS;
2 |
3 | import javafx.scene.Scene;
4 | import javafx.stage.Stage;
5 | import javafx.geometry.HPos;
6 | import javafx.geometry.VPos;
7 | import javafx.scene.Node;
8 | import javafx.scene.layout.HBox;
9 | import javafx.scene.layout.Priority;
10 | import javafx.scene.layout.Region;
11 | import javafx.scene.paint.Color;
12 | import javafx.scene.web.WebEngine;
13 | import javafx.scene.web.WebView;
14 |
15 | public class Gnjs{
16 |
17 | //单例模式
18 | public static volatile Gnjs itstance;
19 | public Gnjs(){}
20 | public static Gnjs getInstance(){
21 | if(itstance == null){
22 | synchronized(Gnjs.class){
23 | if(itstance == null){
24 | itstance = new Gnjs();
25 | }
26 | }
27 | }
28 | return itstance;
29 | }
30 | private Scene scene;
31 | public void start(int width, int height, Stage stage, String str, String url) {
32 | // create the scene
33 | stage.setTitle(str);
34 | scene = new Scene(new Browser(url),width,height, Color.web("#666970"));
35 | stage.setScene(scene);
36 | stage.show();
37 | }
38 | }
39 | class Browser extends Region {
40 |
41 | final WebView browser = new WebView();
42 | final WebEngine webEngine = browser.getEngine();
43 |
44 | public Browser(String url) {
45 | //apply the styles
46 | getStyleClass().add("browser");
47 | // load the web page
48 | webEngine.load(url);
49 | //add the web view to the scene
50 | getChildren().add(browser);
51 |
52 | }
53 | private Node createSpacer() {
54 | Region spacer = new Region();
55 | HBox.setHgrow(spacer, Priority.ALWAYS);
56 | return spacer;
57 | }
58 |
59 | @Override
60 | protected void layoutChildren() {
61 | double w = getWidth();
62 | double h = getHeight();
63 | layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER);
64 | }
65 |
66 | @Override
67 | protected double computePrefWidth(double height) {
68 | return 700;
69 | }
70 |
71 | @Override
72 | protected double computePrefHeight(double width) {
73 | return 600;
74 | }
75 | }
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/HFMT.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 哈夫曼树
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/REDBLACKT.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 红黑树
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/SDBSF.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 树的表示法
6 |
16 |
17 |
18 |
19 |
树的表示法
20 |
21 | 在使用树结构描述实际问题时,大多数不是二叉树,更多的是普通的树结构,
22 | 在存储之间具有普通树结构的数据时,经常使用的方法有3种:
23 | 双亲表示法
24 | 孩子表示法
25 | 孩子兄弟表示法
26 |
27 |
双亲表示法
28 |
29 | 取一块连续的内存空间,在存储每个结点的同时,各自都附加一个记录其父结点
30 | 位置的变量。在树结构中,除了树根外,每个结点都只有一个父结点(又叫“双
31 | 亲结点”)。
32 | 代码表示:
33 |
34 | #define tree_size 100 //宏定义树中结点的最大数量
35 | #define TElemType int //宏定义树结构中数据类型
36 |
37 | typedef struct PTNode
38 | {
39 | TElemType data; //树中结点的数据类型
40 | int parent; //结点的父结点在数组中的位置下标
41 | }PTNode;
42 |
43 | typedef struct
44 | {
45 | PTNode nodes[tree_size]; //存放树中所有结点
46 | int r, n; //根的位置下标和结点数
47 | }PTree;
48 |
49 | 例如,使用双亲表示法存储图 1(A)中的树结构时,数组存储结果为(B):
50 |
51 |

52 |
孩子表示法
53 |
54 | 将树中的每个结点的孩子结点排列成一个线性表,用链表存储起来。对于含有
55 | n 个结点的树来说,就会有 n 个单链表,将 n 个单链表的头指针存储在一
56 | 个线性表中,这样的表示方法就是孩子表示法。
57 | 如果结点没有孩子(例如叶子结点),那么它的单链表为空表。
58 |
59 | 代码表示:
60 | #define TElemType int
61 | #define Tree_Size 100
62 |
63 | //孩子表示法
64 | typedef struct CTNode
65 | {
66 | int child; //链表中每个结点存储的不是数据本身,而是数据在数组
67 | //中存储的位置下标
68 | struct CTNode *next;
69 | }*ChildPtr;
70 |
71 | typedef struct
72 | {
73 | TElemType data; //结点的数据类型
74 | ChildPtr firstchild; //孩子链表的头指针
75 | }CTBox;
76 |
77 | typedef struct
78 | {
79 | CTBox nodes[Tree_Size]; //存储结点的数组
80 | int n, r; //结点数量和树根的位置
81 | }CTree;
82 |
83 | 例如,使用孩子表示法存储图 1 (A),存储效果如图 2:
84 |
85 |

86 |
孩子兄弟表示法
87 |
88 | 使用链式存储结构存储普通树。链表中每个结点由 3 部分组成:
89 |
90 |

91 |
92 | 代码表示:
93 | #define ElemType int
94 | typedef struct CSNode
95 | {
96 | ElemType data;
97 | struct CSNode *firstchild, *nextsibling;
98 | }CSNode, *CSTree;
99 |
100 | 通过孩子兄弟表示法,普通树转化为了二叉树,所以孩子兄弟表示法又被称为
101 | “二叉树表示法”或者“二叉链表表示法”。
102 |
103 | 例如,用孩子兄弟表示法表示图 1 (A)的普通树,存储结果为:
104 |
105 |

106 |
107 |
108 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/gnjs.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/SJGJS/sdgn.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 树的概念
6 |
16 |
17 |
18 |
19 |
树的概念
20 |

21 |
22 | 树 (数据结构名词)
23 |
24 | 树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系
25 | 的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝
26 | 上,而叶朝下的。它具有以下的特点:
27 | 每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结
28 | 点有且只有一个父结点;
29 | 除了根结点外,每个子结点可以分为多个不相交的子树;
30 |
31 | 定义
32 |
33 | 树(tree)是包含n(n>=0)个结点的有穷集,其中:
34 | (1)每个元素称为结点(node);
35 | (2)有一个特定的结点被称为根结点或树根(root)。
36 | (3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,
37 | ……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树
38 | (subtree)。
39 | 树也可以这样定义:树是由根结点和若干颗子树构成的。树是由一个集合以及在
40 | 该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称
41 | 为父子关系。父子关系在树的结点之间建立了一个
42 | 层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的
43 | 根结点,或称为树根。
44 | 我们可以形式地给出树的递归定义如下:
45 | 单个结点是一棵树,树根就是该结点本身。
46 | 设T1,T2,..,Tk是树,它们的根结点分别为n1,n2,..,nk。用一个新结点n作
47 | 为n1,n2,..,nk的父亲,则得到一棵新树,结点n就是新树的根。我们称n1,n2,
48 | ..,nk为一组兄弟结点,它们都是结点n的子结点。
49 | 我们还称T1,T2,..,Tk为结点n的子树。
50 | 空集合也是树,称为空树。空树中没有结点。
51 |
52 | 相关术语
53 |
54 | 节点的度:一个节点含有的子树的个数称为该节点的度;
55 | 叶节点或终端节点:度为0的节点称为叶节点;
56 | 非终端节点或分支节点:度不为0的节点;
57 | 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
58 | 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
59 | 兄弟节点:具有相同父节点的节点互称为兄弟节点;
60 | 树的度:一棵树中,最大的节点的度称为树的度;
61 | 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
62 | 树的高度或深度:树中节点的最大层次;
63 | 堂兄弟节点:双亲在同一层的节点互为堂兄弟;
64 | 节点的祖先:从根到该节点所经分支上的所有节点;
65 | 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
66 | 森林:由m(m>=0)棵互不相交的树的集合称为森林;
67 |
68 | 种类
69 |
70 | 无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由
71 | 树;
72 | 有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
73 | 二叉树:每个节点最多含有两个子树的树称为二叉树;
74 | 完全二叉树
75 | 满二叉树
76 | 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;
77 |
78 | 深度
79 |
80 | 定义一棵树的根结点层次为1,其他节点的层次是其父结点层次加1。一棵树中所有
81 | 结点的层次的最大值称为这棵树的深度。
82 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/images/sdbsf-hzbsf.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanghuiX/JavaFXTest/8756557954e5bc9ce9670715a7577bc9553eaa76/src/sample/MenuItemEvent/images/sdbsf-hzbsf.PNG
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/images/sdbsf-hzxd1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanghuiX/JavaFXTest/8756557954e5bc9ce9670715a7577bc9553eaa76/src/sample/MenuItemEvent/images/sdbsf-hzxd1.PNG
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/images/sdbsf-hzxd2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanghuiX/JavaFXTest/8756557954e5bc9ce9670715a7577bc9553eaa76/src/sample/MenuItemEvent/images/sdbsf-hzxd2.PNG
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/images/sdbsf-sqbsf.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanghuiX/JavaFXTest/8756557954e5bc9ce9670715a7577bc9553eaa76/src/sample/MenuItemEvent/images/sdbsf-sqbsf.PNG
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/images/sdgn.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanghuiX/JavaFXTest/8756557954e5bc9ce9670715a7577bc9553eaa76/src/sample/MenuItemEvent/images/sdgn.PNG
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/images/二叉树.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fanghuiX/JavaFXTest/8756557954e5bc9ce9670715a7577bc9553eaa76/src/sample/MenuItemEvent/images/二叉树.jpg
--------------------------------------------------------------------------------
/src/sample/MenuItemEvent/styles/style.css:
--------------------------------------------------------------------------------
1 | #div_container {
2 | width: 700px;
3 | padding-left: 10px;
4 | background-color: #00FFFF;
5 | }
--------------------------------------------------------------------------------
/src/sample/Robot/InputRobot.java:
--------------------------------------------------------------------------------
1 | package sample.Robot;
2 |
3 | import javafx.application.Application;
4 | import javafx.fxml.FXML;
5 | import javafx.fxml.FXMLLoader;
6 | import javafx.scene.Parent;
7 | import javafx.scene.Scene;
8 | import javafx.scene.control.TextArea;
9 | import javafx.scene.control.TextField;
10 | import javafx.stage.Stage;
11 |
12 | import java.util.ArrayList;
13 |
14 |
15 | public class InputRobot extends Application {
16 | @FXML
17 | private TextField num;
18 | @FXML
19 | private TextArea position;
20 |
21 | private static String ssss = "";
22 | private static int time = 999;
23 |
24 | public void start(Stage primaryStage) throws Exception{
25 | Parent root = FXMLLoader.load(getClass().getResource("/sample/Robot/inputRobot.fxml"));
26 | primaryStage.setTitle("喷漆机器人输入数据");
27 | primaryStage.setScene(new Scene(root, 360, 300));
28 | primaryStage.show();
29 | primaryStage.setResizable(false);
30 | }
31 |
32 | public void clickok() throws Exception{
33 | String string = position.getText();
34 | string = string.replace(" ",",");
35 | string = string.replace("\n",",");
36 | int number = Integer.parseInt(num.getText());
37 | int temp = 0;
38 | String str[] = string.split(",");
39 | for(int i=0;i temp){
41 | temp = Integer.parseInt(str[i]);
42 | }
43 | }
44 | //二维数组存储number个小矩形
45 | String[] blo = string.split(",");
46 | int block[][] = new int[number][5];
47 | for(int i=0;i list = rb.getdata();
56 | //System.out.println(rb.times);
57 | //System.out.println(list.get(0));
58 | outer:for(String ss : list){
59 | //System.out.println(ss);
60 | String[] smid = ss.split(",");
61 | if(smid.length >= number){
62 | for(int i=1;i list = new ArrayList<>();
16 | private int n;
17 | private String str;
18 | public int times = 0;
19 | public Robot(int n,String str){
20 | this.n = n;
21 | this.str = str;
22 | }
23 |
24 | public ArrayList getdata(){
25 | /*7
26 | 0 0 2 2 1
27 | 0 2 1 6 2
28 | 2 0 4 2 1
29 | 1 2 4 3 2
30 | 1 3 3 6 1
31 | 4 0 6 3 1
32 | 3 3 6 6 2*/
33 | /*13
34 | 0 0 3 3 1
35 | 3 0 4 2 2
36 | 4 0 5 2 1
37 | 3 2 4 5 1
38 | 4 2 5 3 2
39 | 4 3 5 6 2
40 | 2 3 3 4 1
41 | 0 3 2 4 2
42 | 0 4 1 8 3
43 | 1 4 3 5 2
44 | 1 5 4 6 3
45 | 1 6 3 8 1
46 | 3 6 5 8 1*/
47 | /*int block[][] = {{0,0,2,2,1},{0,2,1,6,2},{2,0,4,2,1},{1,2,4,3,2},{1,3,3,6,1},
48 | {4,0,6,3,1},{3,3,6,6,2},{6,6,8,8,3}};*/
49 |
50 | String[] string = str.split(",");
51 | int block[][] = new int[n][5];
52 | //System.out.println(n);
53 | for(int i=0;i=0 && board[i+1][j]>=0 && board[i][j]!=board[i+1][j]){
95 | g[board[i][j]][board[i+1][j]] = true;
96 | }
97 | }
98 | }
99 |
100 | comp();
101 | return list;
102 | }
103 |
104 | public void comp(){
105 | int opt = -1;
106 | for(int i=0; im[i][po2[n]-1]){
112 | opt = m[i][po2[n]-1];
113 | }
114 | }
115 | //System.out.println(opt);
116 | times = opt;
117 | //return opt;
118 | }
119 |
120 | public void backtrack(int r, int p){
121 | if(m[r][p] >= 0) {
122 | //System.out.println("v:"+m[r][p]);
123 | return;
124 | }
125 | for(int i=0; i0 && g[i][r])){
127 | //System.out.println(i+" "+r);
128 | m[r][p] = MAXx;
129 | return;
130 | }
131 |
132 | int np = p-po2[r];
133 | //System.out.println(np);
134 | if(np == 0) {
135 | m[r][p]=1;
136 | }
137 | else {
138 | //sb = new StringBuffer("");
139 | sb.append(r+",");
140 | //System.out.println("r2: "+r);
141 | for(int i=0; i 0){
143 | //System.out.println("hhh"+i);
144 | backtrack(i,np);
145 | //System.out.println(r+" "+i);
146 | sb.append(i+",");
147 | int v = m[i][np]+(color[r]==color[i]?0:1);
148 | if(m[r][p]<0 || m[r][p]>v) {
149 | m[r][p]=v;
150 | }
151 | }
152 | //System.out.println(sb.toString());
153 | }
154 | }
155 |
156 | }
157 |
--------------------------------------------------------------------------------
/src/sample/Robot/inputRobot.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/sample/Robot/paintRobot.java:
--------------------------------------------------------------------------------
1 | package sample.Robot;
2 |
3 | import javax.swing.*;
4 | import java.awt.*;
5 |
6 | public class paintRobot extends JPanel {
7 |
8 | private int width, height;
9 | private Main mainBoard = null;
10 | private int number;
11 | private String string;
12 | private Rectangle[] rect;
13 | private int times;
14 | private int[][] block;
15 | private String take = "准备拿起喷枪";
16 | public paintRobot(int width, int height, Main mainBoard, int number, String string) {
17 | this.width = width;
18 | this.height = height;
19 | this.mainBoard = mainBoard;
20 | this.number = number;
21 | this.string = string;
22 | setLayout(null);
23 | setBounds(0, 0, width, height);
24 | setBackground(Color.white);
25 |
26 | setVisible(false);
27 | setFocusable(true);
28 | }
29 | public void paintComponent(Graphics g){
30 | super.paintComponent(g);
31 | Graphics2D gg = (Graphics2D) g;
32 | Stroke s = gg.getStroke();
33 | for(int i=0;i=1){
95 | if(block[j][4] != block[Integer.parseInt(order[i-1])][4]){
96 | times++;
97 | }
98 | }
99 | Thread.sleep(1300);
100 | }
101 | take = "喷漆结束!";
102 | }
103 |
104 | private class paintThread extends Thread {
105 | @Override
106 | public void run() {
107 | while(true){
108 | repaint();
109 | try {
110 | Thread.sleep(100);
111 | } catch (InterruptedException e) {
112 | e.printStackTrace();
113 | break;
114 | }
115 | }
116 | }
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/src/sample/SearchBT/HeapNode.java:
--------------------------------------------------------------------------------
1 | package sample.SearchBT;
2 |
3 | import java.awt.*;
4 |
5 | public class HeapNode {//用于堆排序的数据展示,为圆形节点样式
6 | private int x,y;//代表坐标
7 | private int colorInner=WHITE;//节点内部的颜色
8 | private int colorOut=BLACK;//节点外部的颜色
9 | private int colorV=BLACK;//节点的值的颜色
10 | private int value; //代表值
11 | public static final int YELLOW=1;//预先设置的常量,用于绘制时的颜色判断
12 | public static final int RED=2;
13 | public static final int BLUE=3;
14 | public static final int GREEN=4;
15 | public static final int BLACK=5;
16 | public static final int GLASSGREEN=6;
17 | public static final int YELLOW2=7;
18 | public static final int WHITE=8;
19 | public HeapNode(){}
20 | public HeapNode(int x,int y,int value){
21 | this.x=x;
22 | this.value=value;
23 | this.y=y;
24 | }
25 | public void paintNode(Graphics2D g){
26 | Stroke s = g.getStroke();
27 | switch (colorOut) {
28 | case YELLOW:
29 | g.setColor(Color.yellow);
30 | break;
31 | case RED:
32 | g.setColor(Color.red);
33 | break;
34 | case BLUE:
35 | g.setColor(Color.cyan);
36 | break;
37 | case BLACK:
38 | g.setColor(Color.BLACK);
39 | break;
40 | case GREEN:
41 | g.setColor(Color.GREEN);
42 | break;
43 | case GLASSGREEN:
44 | g.setColor(new Color(82,188,105));
45 | break;
46 | case YELLOW2:
47 | g.setColor(new Color(254,197,21));
48 | break;
49 | case WHITE:
50 | g.setColor(Color.white);
51 | break;
52 | }
53 | g.setStroke(s);
54 | g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
55 | g.fillOval(x,y,50,50);
56 |
57 | switch (colorInner) {
58 | case YELLOW:
59 | g.setColor(Color.yellow);
60 | break;
61 | case RED:
62 | g.setColor(Color.red);
63 | break;
64 | case BLUE:
65 | g.setColor(Color.cyan);
66 | break;
67 | case BLACK:
68 | g.setColor(Color.BLACK);
69 | break;
70 | case GREEN:
71 | g.setColor(Color.GREEN);
72 | break;
73 | case GLASSGREEN:
74 | g.setColor(new Color(82,188,105));
75 | break;
76 | case YELLOW2:
77 | g.setColor(new Color(254,197,21));
78 | break;
79 | case WHITE:
80 | g.setColor(Color.white);
81 | break;
82 | }
83 | g.setStroke(s);
84 | g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
85 | g.fillOval(x+3,y+3,44,44);
86 |
87 | switch (colorV) {
88 | case YELLOW:
89 | g.setColor(Color.yellow);
90 | break;
91 | case RED:
92 | g.setColor(Color.red);
93 | break;
94 | case BLUE:
95 | g.setColor(Color.cyan);
96 | break;
97 | case BLACK:
98 | g.setColor(Color.BLACK);
99 | break;
100 | case GREEN:
101 | g.setColor(Color.GREEN);
102 | break;
103 | case GLASSGREEN:
104 | g.setColor(new Color(82,188,105));
105 | break;
106 | case YELLOW2:
107 | g.setColor(new Color(254,197,21));
108 | break;
109 | case WHITE:
110 | g.setColor(Color.white);
111 | break;
112 | }
113 | g.setStroke(s);
114 | g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
115 | Font font1 = new Font("微软雅黑", Font.PLAIN, 18);
116 | g.setFont(font1);
117 | if (value==100){
118 | g.drawString(value+"",x+8,y+32);
119 | }
120 | else if(value-10<0)g.drawString(value+"",x+18,y+32);
121 | else {
122 | g.drawString(value+"",x+15,y+31);
123 | }
124 |
125 | }
126 | public void move(int moveX,int moveY,int time){
127 | int disX = (moveX-this.x)/time;
128 | int disY = (moveY-this.y)/time;
129 | int xc = Math.abs(moveX-this.x-disX*time);
130 | int yc = Math.abs(moveY-this.y-disY*time);
131 | for(int i=0;i