高级农民
- 积分
- 1149
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-2-26
- 最后登录
- 1970-1-1
|
顺便po一下我刚才码的迷宫生成的bfs 和 dfs两个解好了... 再多攒点人品好了
- import java.util.*;
- public class Maze{
- int[] start, end;
- Cell[][] maze;
- boolean[][] visited;
- int[][] dirs = {{-1,0}, {1, 0}, {0, -1}, {0, 1}};
- class Cell{
- boolean up_open;
- boolean down_open;
- boolean left_open;
- boolean right_open;
- }
- public Maze(int height, int width, int[] start, int[] end ){
- maze = new Cell[height][width];
- visited = new boolean[height][width];
- for (int i=0; i<maze.length; i++)
- for (int j=0; j<maze[0].length; j++){
- maze[i][j] = new Cell();
- }
-
- this.start = start;
- this.end = end;
- }
- public void bfs_construct(){
- Queue<int[]> q = new LinkedList();
- q.offer(start);
- visited[start[0]][start[1]] = true;
- while (!q.isEmpty()){
- int[] pos = q.poll();
- ArrayList<Integer> dir_set = getRandomDir();
- for (int i: dir_set){
- int new_x = pos[0] + dirs[i][0];
- int new_y = pos[1] + dirs[i][1];
- if (inBound(new_x,new_y) && !visited[new_x][new_y]){
- Cell curr_cell = maze[pos[0]][pos[1]];
- Cell next_cell = maze[new_x][new_y];
- if (i == 0){
- curr_cell.up_open = true;
- next_cell.down_open = true;
- }
- else if (i == 1){
- curr_cell.down_open = true;
- next_cell.up_open = true;
- }
- else if (i == 2){
- curr_cell.left_open = true;
- next_cell.right_open = true;
- }
- else if (i == 3){
- curr_cell.right_open = true;
- next_cell.left_open = true;
- }
- q.offer(new int[]{new_x, new_y});
- visited[new_x][new_y] = true;
- }
- }
- }
- }
- public void dfs_construct(int x, int y){
- if (!inBound(x, y)) return;
- visited[x][y] = true;
- // pick random neighbor
- ArrayList<Integer> dir_set = getRandomDir();
- for (int i: dir_set){
- int new_x = x + dirs[i][0];
- int new_y = y + dirs[i][1];
- if (inBound(new_x,new_y) && !visited[new_x][new_y]){
- Cell curr_cell = maze[x][y];
- Cell next_cell = maze[new_x][new_y];
- if (i == 0){
- curr_cell.up_open = true;
- next_cell.down_open = true;
- }
- else if (i == 1){
- curr_cell.down_open = true;
- next_cell.up_open = true;
- }
- else if (i == 2){
- curr_cell.left_open = true;
- next_cell.right_open = true;
- }
- else if (i == 3){
- curr_cell.right_open = true;
- next_cell.left_open = true;
- }
- dfs_construct(new_x, new_y);
- }
- }
- }
- Random rand = new Random();
- private ArrayList<Integer> getRandomDir(){
- ArrayList<Integer> dir_set = new ArrayList();
- while (dir_set.size()< 4){
- int d = rand.nextInt(4);
- if (!dir_set.contains(d)) dir_set.add(d);
- }
- return dir_set;
-
- }
- private boolean inBound(int i, int j){
- if (i < 0 || j < 0 || i > maze.length-1 || j > maze[0].length-1) return false;
- return true;
- }
- public void print(){
- for (int i=0; i<maze.length; i++){
- String s1 = "";
- String s2 = "";
- String s3 = "";
- for (int j=0; j<maze[0].length; j++){
- Cell curr_cell = maze[i][j];
- s1 += " ";
- if (curr_cell.up_open) s1 += " "; else s1 += "-";
- s1 += " ";
-
- if (curr_cell.left_open) s2 += " "; else s2 += "|";
- if (start[0] == i && start[1] == j)
- s2 += "S";
- else if (end[0] == i && end[1] == j)
- s2 += "E";
- else
- s2 += " ";
- if (curr_cell.right_open) s2 += " "; else s2 += "|";
- s3 += " ";
- if (curr_cell.down_open) s3 += " "; else s3 += "-";
- s3 += " ";
- }
- System.out.println(s1);
- System.out.println(s2);
- System.out.println(s3);
- }
- }
- public static void main(String[] args){
- Maze m = new Maze(10, 10, new int[]{1,3}, new int[]{8,7});
- // m.print();
- // m.bfs_construct();
- m.dfs_construct(1,3);
- m.print();
- System.out.println();
- }
- }
复制代码 |
|