有个多年未见的老同学突然找我,
我还以为是找我借钱,菊花一紧。
还好是叫我帮他写个迷宫程序:
说是什么语言都行,就用java实现了一版,
比较粗糙,还有可以优化的地方。但是他也不懂,写的好不好的应该看不出来,保证能用就行了,代码如下:
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 迷宫问题
*/
public class Dream {
private static List<String> PATH = new ArrayList<>();//路径
private static int[][] DREAM ={
//列 0,1,2,3,4,5,6,7,8,9,10,11
{1,1,1,1,1,1,1,1,1,1,1,1}, //0行
{1,0,0,0,0,0,0,1,0,0,0,1}, //1行
{1,0,1,0,1,0,0,0,0,1,0,1}, //2行
{1,0,0,0,0,0,1,1,0,0,0,1}, //3行
{1,0,0,1,0,0,0,0,0,1,0,1}, //4行
{1,1,0,1,0,1,0,1,1,0,0,1}, //5行
{1,0,0,0,0,0,1,0,0,0,1,1}, //6行
{1,0,1,0,1,0,0,1,0,1,0,0}, //7行
{1,0,0,0,0,1,0,1,0,0,0,1}, //8行
{1,1,1,1,1,1,1,1,1,1,1,1}, //9行
};
public static void main(String[] args) {
// 入口位置
Node start = new Node(1,1,null);
// 出口位置
Node end = new Node(7,11,null);
// 最后一个的位置,用来防止越界
Node last = new Node(9,11,null);
Queue<Node> queue=new LinkedList<>();
queue.add(start);
Node result = null;
while (!queue.isEmpty()){
Node temp=queue.poll();
//将相邻的可达点加入队列
do {
temp=findNext(temp,last);
if (temp!=null){
queue.add(temp);
if (temp.x == end.x && temp.y == end.y){//找到了
result = temp;
}
}
}while (temp!=null);
}
if(result == null){
System.out.println("图形有误,没有出口");
}else{
System.out.println("路径如下:");
print(result);
int begin = PATH.lastIndexOf(getPath(start));
PATH = PATH.subList(begin, PATH.size());
for(String location : PATH){
System.out.println(location);
}
System.out.println("结束");
}
}
/**
* 递归输出
*/
private static void print(Node node) {
if (node.pre==null){
PATH.add(getPath(node));
}else {
print(node.pre);
PATH.add(getPath(node));
}
}
private static String getPath(Node node) {
return "(" + node.x + "行," + node.y + "列)";
}
/**
* 往四个方向寻找一个可以到达的点
*/
private static Node findNext(Node node,Node last){
if(node.x >= last.x || node.y >= last.y){//越界了
return null;
}
if (DREAM[node.x+1][node.y]==0){
//标记已经到达过
DREAM[node.x+1][node.y]=2;
return new Node(node.x+1, node.y, node);
}
if (DREAM[node.x-1][node.y]==0){
DREAM[node.x-1][node.y]=2;
return new Node(node.x-1, node.y, node);
}
if (DREAM[node.x][node.y+1]==0){
DREAM[node.x][node.y+1]=2;
return new Node(node.x, node.y+1, node);
}
if (DREAM[node.x][node.y-1]==0){
DREAM[node.x][node.y-1]=2;
return new Node(node.x, node.y-1, node);
}
return null;
}
static class Node{
int x;
int y;
Node pre;
Node(int x, int y, Node pre) {
this.x = x;
this.y = y;
this.pre = pre;
}
}
}
运行后结果如下:
要改动的话,只要改一下如下配置,其他地方不用改: