符号表示
‘A’:向上走
V:/向下走
‘<’:向左走
‘>’:向右走
’ ':空地
‘P’:目的地
‘W’:墙
‘X’:此点无法到达目的地
特点
- 自动生成障碍物
- 可重置生成障碍物的位置
- 形象显示路径且不使用额外数组存储路径
- 起始点坐标默认(1,1)
地图样例
生成路径
注意事项:
- if(findPath(x,y+1,aimx,aimy)||findPath(x+1,y,aimx,aimy)||findPath(x,y-1,aimx,aimy)||findPath(x-1,y,aimx,aimy)){//这里表明通过(x,y)点能到达目的地,所以递归将一路向上返回true,退出。
- if(map[y][x]==AIM)
map[aimy][aimx]=PATH;
这一步是需要的,因为到达了目的地,用于标记可以一路退出。
代码实现及解释
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class MiGongPro {
static char[][] map;
static final char KONG=' ';//空
static final char AIM='P';//目的地
static final char SHANG='A';//向上走
static final char XIA='V';//向下走
static final char ZUO='<';//向左走
static final char YOU='>';//向右走
static final char WALL='W';//墙
static final char BLOCK='X';//此点无法到达目的地
public static void main(String[] args) throws IOException {
int len,width;
StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
System.out.print("请输入迷宫规模(长宽大于2)"+"\n"+"请输入长度 宽度:");
st.nextToken();
len=(int)st.nval;
st.nextToken();
width=(int)st.nval;
map=new char[len][width];
System.out.print("请输入目标点坐标(左上角为(1,1)):");
//请输入目标点坐标
st.nextToken();
int aimx,aimy;
aimx=(int)st.nval-1;
st.nextToken();
aimy=(int)st.nval-1;
String yes;
do {
//初始化地图
for (int i = 0; i < len; i++) {
for (int j = 0; j < width; j++) {
map[i][j]=KONG;
}
}
for (int i = 0; i < len; i++) {
map[i][0]=WALL;
map[i][width-1]=WALL;
}
for (int j = 1; j < width-1; j++) {
map[0][j]=WALL;
map[len-1][j]=WALL;
}
map[aimy][aimx]=AIM;
System.out.println("随机生成障碍物中");
for (int i = 0; i < len; i++) {
int wx = (int) (Math.random() * (width - 2) + 1);
int wy = (int) (Math.random() * (len - 2) + 1);
if (map[wy][wx] == KONG && !(wx == 1 && wy == 1))//不生成在非空或起始点或目的地
map[wy][wx] = WALL;
else
i--;
}
//打印迷宫
System.out.println("生成地图如下:");
for (char[] ma : map) {
for (char i : ma) {
System.out.print(i + " ");
}
System.out.println();
}
System.out.println("是否重新生成障碍物?(y/n");
st.nextToken();
yes=st.sval;
}while (yes.charAt(0)=='y'||yes.charAt(0)=='Y');
boolean can=findPath(1,1,aimx,aimy,XIA);
System.out.println("生成路径如下:");
for(char[] ma:map){
for(char i:ma){
System.out.print(i+" ");
}
System.out.println();
}
if(!can)
System.out.println("无路可走");
}
static boolean findPath(int x,int y,int aimx,int aimy,char fx){
if(map[y][x]==AIM){//到达目的地,标记以便通过@退出递归调用
map[aimy][aimx]=fx;
}
if(map[aimy][aimx]!=AIM){//@
return true;
}
if(map[y][x]!=KONG)//未到目的地且走不通
return false;
map[y][x]=fx;//尝试加入路径
if(findPath(x,y+1,aimx,aimy,XIA)||findPath(x+1,y,aimx,aimy,YOU)||findPath(x,y-1,aimx,aimy,SHANG)||findPath(x-1,y,aimx,aimy,ZUO)){//下右上左探索地图找目标点
return true;
}
else{//都不能到达目标点,所以从(x,y)坐标无法到达目标点,标记该点已经被探索且无法到达
map[y][x]=BLOCK;//不能加入路径
return false;
}
}
}
测试用例
请输入迷宫规模(长宽大于2)
请输入长度 宽度:8 8
请输入目标点坐标(左上角为(1,1)):3 7
随机生成障碍物中
生成地图如下:
W W W W W W W W
W W W
W W W W
W W W W W
W W
W W W
W P W W
W W W W W W W W
是否重新生成障碍物?(y/n
y
随机生成障碍物中
生成地图如下:
W W W W W W W W
W W W
W W W W W
W W W
W W W
W W W
W W P W
W W W W W W W W
是否重新生成障碍物?(y/n
n
生成路径如下:
W W W W W W W W
W V > W W
W W V W W W
W V W W
W W V W
W V W W
W W V W
W W W W W W W W