java利用递归解决迷宫问题

用一个二维数组表示迷宫,0表示通路,1表示围墙,给定入口和出口,寻找所有可能的通路。例如:

111111111111
100011111111
111011000011
111011011011
111000011011
111011011011
111000011011
111111011011
110000000001
111111111111

该迷宫较为简单,可看出有四条通路。可以利用递归的算法来找出所有通路。从入口开始作为当前节点,判断其上下左右四个节点是否可以通过,可以则选取其中一个作为当前节点并标记为已访问,重复该步骤,用2标记通路,直至到达出口,打印该方案。实现代码如下:

import java.util.*;
public class Maze {
	//初始化迷宫矩阵
	public static int[][] maze = 
		{
				{1,1,1,1,1,1,1,1,1,1,1,1},
				{1,0,0,0,1,1,1,1,1,1,1,1},
				{1,1,1,0,1,1,0,0,0,0,1,1},
				{1,1,1,0,1,1,0,1,1,0,1,1},
				{1,1,1,0,0,0,0,1,1,0,1,1},
				{1,1,1,0,1,1,0,1,1,0,1,1},
				{1,1,1,0,0,0,0,1,1,0,1,1},
				{1,1,1,1,1,1,0,1,1,0,1,1},
				{1,1,0,0,0,0,0,0,0,0,0,1},
				{1,1,1,1,1,1,1,1,1,1,1,1}
		};
	public static int bx = 1, by = 1, ex = 8, ey = 10;//入口、出口的行列下标
	public static int count = 0;//记录方案的个数
	public static int[][] state = new int[maze.length][maze[0].length];//记录节点是否被访问,0表示未,1表示已
	public static void main(String[] args){		
		for(int i=0; i<state.length; i++){Arrays.fill(state[i],0);}
		maze[bx][by] = 2;
		move(bx,by);
	}
	public static void move(int i, int j){
		maze[i][j] = 2;//用2标记该节点,表示选择该节点作为路径节点之一
		state[i][j] = 1;//用1表示该节点已被访问,避免出现环路
		if(i==ex&&j==ey){
			count++;
			System.out.println("方案"+count+":");
			for(int k=0;k<maze.length;k++){//打印方案
				for(int l=0;l<maze[k].length;l++){
					System.out.print(maze[k][l]+" ");
				}
				System.out.println();
			}			
		}
		else{//判断上下左右可通节点
			if(maze[i][j+1]==0&&state[i][j+1]==0){
				move(i,j+1);
			}
			if(maze[i+1][j]==0&&state[i+1][j]==0){
				move(i+1,j);
			}
			if(maze[i-1][j]==0&&state[i-1][j]==0){
				move(i-1,j);
			}
			if(maze[i][j-1]==0&&state[i][j-1]==0){
				move(i,j-1);
			}
		}
		maze[i][j] = 0;
		state[i][j] = 0;
	}
}

输出:

方案1:
1 1 1 1 1 1 1 1 1 1 1 1 
1 2 2 2 1 1 1 1 1 1 1 1 
1 1 1 2 1 1 0 0 0 0 1 1 
1 1 1 2 1 1 0 1 1 0 1 1 
1 1 1 2 2 2 2 1 1 0 1 1 
1 1 1 0 1 1 2 1 1 0 1 1 
1 1 1 0 0 0 2 1 1 0 1 1 
1 1 1 1 1 1 2 1 1 0 1 1 
1 1 0 0 0 0 2 2 2 2 2 1 
1 1 1 1 1 1 1 1 1 1 1 1 
方案2:
1 1 1 1 1 1 1 1 1 1 1 1 
1 2 2 2 1 1 1 1 1 1 1 1 
1 1 1 2 1 1 2 2 2 2 1 1 
1 1 1 2 1 1 2 1 1 2 1 1 
1 1 1 2 2 2 2 1 1 2 1 1 
1 1 1 0 1 1 0 1 1 2 1 1 
1 1 1 0 0 0 0 1 1 2 1 1 
1 1 1 1 1 1 0 1 1 2 1 1 
1 1 0 0 0 0 0 0 0 2 2 1 
1 1 1 1 1 1 1 1 1 1 1 1 
方案3:
1 1 1 1 1 1 1 1 1 1 1 1 
1 2 2 2 1 1 1 1 1 1 1 1 
1 1 1 2 1 1 0 0 0 0 1 1 
1 1 1 2 1 1 0 1 1 0 1 1 
1 1 1 2 0 0 0 1 1 0 1 1 
1 1 1 2 1 1 0 1 1 0 1 1 
1 1 1 2 2 2 2 1 1 0 1 1 
1 1 1 1 1 1 2 1 1 0 1 1 
1 1 0 0 0 0 2 2 2 2 2 1 
1 1 1 1 1 1 1 1 1 1 1 1 
方案4:
1 1 1 1 1 1 1 1 1 1 1 1 
1 2 2 2 1 1 1 1 1 1 1 1 
1 1 1 2 1 1 2 2 2 2 1 1 
1 1 1 2 1 1 2 1 1 2 1 1 
1 1 1 2 0 0 2 1 1 2 1 1 
1 1 1 2 1 1 2 1 1 2 1 1 
1 1 1 2 2 2 2 1 1 2 1 1 
1 1 1 1 1 1 0 1 1 2 1 1 
1 1 0 0 0 0 0 0 0 2 2 1 
1 1 1 1 1 1 1 1 1 1 1 1 

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/yange1025/article/details/51273486
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞