迷宫求解最短路径问题java版

对于计算机,面对错乱复杂的迷宫探路问题也不可能一步就找到最优路径,而是把所有可行路径全部走过然后通过比较找出最优路径,对于每走一步都有4个可行方向可走,然后通过循环借助计算机的高效率找出最优路径。代码如下:

public class Maze {
//出口目标点坐标
private static final int X = 8;
private static final int Y = 8;

private static final int MaxSize = 200;
//迷宫路径
int[][] maze = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1},
};

Node Stack[] = new Node[MaxSize];
Node Path[] = new Node[MaxSize];
//栈顶指针
int top = -1;
//路径的计数
int count = 1;
//记录最短路径
int minlen = MaxSize;

public Maze() {
System.out.println("路径如下:");
mazePath(1,1,X,Y);
}
//寻路方法
public void mazePath(int xi,int yi,int xe,int ye){
int i,j,di,find;
//初始化栈 起始地点入栈
top++;
Node n = new Node();
Stack[top] = n;
System.out.println(Stack[top]);
Stack[top].i = xi;
Stack[top].j = yi;
Stack[top].di = -1;
maze[xi][yi] = -1;
//如果栈不为空就继续探路
while(top>-1){
//取出栈顶元素
i = Stack[top].i;
j = Stack[top].j;
di = Stack[top].di;
//判断是否已经找到目标点出口  如果找到出口那么打印路径
if(i==xe && j ==ye){
System.out.println("  "+(count++));
for(int k = 0;k <= top;k++){
System.out.printf("(%d , %d)",Stack[k].i,Stack[k].j);
//每行打印5个坐标点然后换行
if((k+1)%5==0){
System.out.println("");
}
}
System.out.println("");
//找出最短路径  然后赋值给Path
if(top+1 < minlen){
minlen = top+1;
System.out.println(minlen+"");
for(int k = 0;k <= top;k++){
Node node = new Node();
Path[k] = node;
Path[k].i = Stack[k].i;
Path[k].j = Stack[k].j;
Path[k].di = Stack[k].di;
}
}
//退出一步继续查找可行路径
maze[Stack[top].i][Stack[top].j] = 0;
top--;
i = Stack[top].i;
j = Stack[top].j;
di = Stack[top].di;
}
//根据四个方向试探性的查找可行路径
find = 0;//用来标记是否已经找到可行路径  0 没找到  1找到
while(find==0 && di<4){
di++;
switch(di){
           case 0: i = Stack[top].i-1;j = Stack[top].j;break;
           case 1: i = Stack[top].i;j = Stack[top].j+1;break;
           case 2: i = Stack[top].i+1;j = Stack[top].j;break;
           case 3: i = Stack[top].i;j = Stack[top].j-1;break;
           }
//如果找到可行路径那么find标记为1
if(maze[i][j] == 0){
find = 1;
}
}
if(find == 1){
//如果找到出口那么进栈
Stack[top].di = di;  //进栈前记录当前立脚点的寻路方向
top++;
Node n1 = new Node();
Stack[top] = n1;
Stack[top].i = i;
Stack[top].j = j;
Stack[top].di = -1;
//已走过路径标记为-1防止重复路过
maze[i][j] = -1;
}else{
//否则退一步,然后继续试探可行路径
maze[Stack[top].i][Stack[top].j] = 0;  //释放路径 为了以后的试探让路
top--;
}
}
//一切执行结束后打印最短路径
System.out.println("最短路径如下:");
System.out.println("最短路径长度:"+minlen);
System.out.println("路径:");
//打印最短路径
for(int k = 0;k < minlen;k++){
System.out.printf("(%d , %d)",Path[k].i,Path[k].j);
if((k+1)%5 == 0){
System.out.println("");
}
}
System.out.println("");
}
class Node{
int i;
int j;
int di;
}
public static void main(String[] args) {
new Maze();
}
}

以下是使用广度优先搜索算法求解迷宫最短路径的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #define ROW 6 // 迷宫行数 #define COL 6 // 迷宫列数 // 迷宫地图 int maze[ROW][COL] = { {0, 0, 0, 0, 0, 0}, {0, 1, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1}, {0, 1, 0, 1, 0, 0}, {0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0} }; // 记录迷宫中每个位置是否被访问过 int visited[ROW][COL] = {0}; // 记录每个位置的前一个位置 int pre[ROW][COL][2] = {0}; // 用于存储路径的队列 int queue[ROW*COL][2] = {0}; // 队列头和尾指针 int front = 0, rear = 0; // 判断是否到达终点 int isEnd(int row, int col) { return row == ROW-1 && col == COL-1; } // 判断某个位置是否可以走 int canMove(int row, int col) { return row >= 0 && row < ROW && col >= 0 && col < COL && maze[row][col] == 0 && visited[row][col] == 0; } // 打印路径 void printPath() { int row = ROW-1, col = COL-1; printf("Path: (%d, %d)", row, col); while (row != 0 || col != 0) { int temp_row = row, temp_col = col; row = pre[temp_row][temp_col][0]; col = pre[temp_row][temp_col][1]; printf(" -> (%d, %d)", row, col); } printf("\n"); } // 广度优先搜索 void bfs() { // 先将起点加入队列 queue[rear][0] = 0; queue[rear][1] = 0; rear++; visited[0][0] = 1; // 开始搜索 while (front != rear) { // 出队 int row = queue[front][0]; int col = queue[front][1]; front++; // 判断是否到达终点 if (isEnd(row, col)) { // 打印路径 printPath(); return; } // 尝试向上走 if (canMove(row-1, col)) { // 加入队列 queue[rear][0] = row-1; queue[rear][1] = col; rear++; visited[row-1][col] = 1; pre[row-1][col][0] = row; pre[row-1][col][1] = col; } // 尝试向下走 if (canMove(row+1, col)) { // 加入队列 queue[rear][0] = row+1; queue[rear][1] = col; rear++; visited[row+1][col] = 1; pre[row+1][col][0] = row; pre[row+1][col][1] = col; } // 尝试向左走 if (canMove(row, col-1)) { // 加入队列 queue[rear][0] = row; queue[rear][1] = col-1; rear++; visited[row][col-1] = 1; pre[row][col-1][0] = row; pre[row][col-1][1] = col; } // 尝试向右走 if (canMove(row, col+1)) { // 加入队列 queue[rear][0] = row; queue[rear][1] = col+1; rear++; visited[row][col+1] = 1; pre[row][col+1][0] = row; pre[row][col+1][1] = col; } } // 没有找到路径 printf("No path found!\n"); } int main() { bfs(); return 0; } ``` 该算法使用一个队列来存储待访问的位置,每次从队首取出一个位置进行访问,并将它周围可以访问的位置加入队列。在访问每个位置时,记录它的前一个位置,最后通过前一个位置数组来构造出最短路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值