/**
* 使用改进的Dijkstra算法进行路径规划,每次选出一个到初始节点距离最短的节点
*
**/
package page;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*; //LinkedList
public class KDijkstra
{
public static int comparenumber=0; //用于保存该算法所进行的比较次数
public static int computernumber=0; //用于计算该算法进行计算的次数
//无参构造函数
public KDijkstra()
{
}
//有参构造函数
public KDijkstra(JButton[][] b,int[][] environ,int MaxM,int MaxN,int startX,int startY,int goalX,int goalY)
{
//如果目标位置就是初始位置,则直接输出说明语句即可,无需进行路径规划。
if(startX==goalX&&startY==goalY)
{
System.out.println("the goal cell is the start cell, so do not need to planning path!");
}
//如果目标位置不是初始位置,则进行如下的路径规划
else
{
//给出算法所用变量的说明
LinkedList open=new LinkedList(); //保存扩展到的节点
LinkedList closed=new LinkedList(); //保存规划过的节点
int nowx=0,nowy=0; //目前正在处理单元格的位置
int nowdis=0; //目前正在处理单元格到初始单元格的距离
//处理初始单元格,创建其对应的节点加入closed表中,该节点的父节点指向自身
KNodes now=new KNodes(startX,startY,startX,startY,0);
closed.add(now);
nowx=startX;
nowy=startY;
nowdis=0;
int x=nowx-1; //目前正在处理的单元的邻近单元位置
int y=0;
int distance1=nowdis+10; //目前正在处理单元的邻近单元到初始节点的距离
int distance2=nowdis+14;
//处理初始单元的八个邻近单元,创建其对应的节点,并加入open表中
//处理初始单元格的上一行的三个邻近单元
if(x>=0&&x<MaxM) //如果上一行存在,则对其上一行的邻近节点进行判断
{
y=nowy-1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
y=nowy;
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
}//上一行的三个邻近单元处理结束
//处理同一行的两个节点
x=nowx;
y=nowy-1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy);
//同行的两个节点处理完毕
//处理下一行的三个邻近节点
x=nowx+1;
if(x>=0&&x<MaxM) //如果下一行存在,则对其下一行的邻近节点进行判断
{
y=nowy-1;
if(y>=0&&y<MaxN) //如果下左节点存在,则对其进行判断
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
y=nowy;
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
}//下一行的三个邻近单元处理结束
//初始节点的八个邻近单元处理完毕
//选出open表中路径最短者
now=(KNodes)new KChooseOpen(open).getNode();
int prex=0;
int prey=0;
int addx=0;
int addy=0;
nowx=now.getX();
nowy=now.getY();
//Step4: 判断循环条件,判断是否已经标识了目标节点,如果没有,则进行下面的循环
while(nowx!=goalX||nowy!=goalY)
{
//Step5: 从open中将距离最短的节点删除,将该节点的临近节点加入open对列中
open.remove(now);
closed.add(now);
nowdis=now.getDistance();
distance1=nowdis+10;
distance2=nowdis+14;
prex=now.getPrex();
prey=now.getPrey();
addx=prex-nowx;
addy=prey-nowy;
//父节点在下面一行
if(addx==1)
{
if(addy==1)//父节点在右下位置,需要处理的节点有上一行和左一列
{
//处理上一行
x=nowx-1;
if(x>=0&&x<MaxM)
{
y=nowy-1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
y=nowy;
new KExtendDemo(environ,x,y,distance1,open,nowx,nowy,0);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo(environ,x,y,distance2,open,nowx,nowy);
}//上一行处理完毕
//处理左边节点
y=nowy-1;
if(y>=0&&y<MaxN)
{
x=nowx;
new KExtendDemo(environ,x,y,distance1,open,nowx,nowy,0);
x=nowx+1;
if(x>=0&&x<MaxM)
new KExtendDemo(environ,x,y,distance2,open,nowx,nowy);
}//左边节点处理完毕
}//addx==1&&addy==1
else if(addy==0)
{
//需要处理上一行节点
x=nowx-1;
if(x>=0&&x<MaxM) //如果上一行存在,则对其上一行的邻近节点进行判断
{
y=nowy-1;
if(y>=0&&y<MaxN) //如果上左节点存在,则对其进行判断
new KExtendDemo(environ,x,y,distance2,open,nowx,nowy);
y=nowy;
new KExtendDemo(environ,x,y,distance1,open,nowx,nowy,0);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo(environ,x,y,distance2,open,nowx,nowy);
}//上一行处理完毕
}//addx==1&&addy==0
else//需要处理上一行和右一列
{
//上一行
x=nowx-1;
if(x>=0&&x<MaxM)
{
y=nowy-1;
if(y>=0&&y<MaxN)
new KExtendDemo(environ,x,y,distance2,open,nowx,nowy);
y=nowy;
new KExtendDemo(environ,x,y,distance1,open,nowx,nowy,0);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo(environ,x,y,distance2,open,nowx,nowy);
}//上一行处理完毕
//右一列
y=nowy+1;
if(y>=0&&y<MaxN)
{
x=nowx;
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy,0);
x=nowx+1;
if(x>=0&&x<MaxM)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
}//右边节点处理完毕
}//addx==1&&addy==1
} //if(addx==1) 父节点在下一行
//父节点与now节点同行
else if(addx==0)
{
if(addy==1)//需要处理左一列
{
y=nowy-1;
if(y>=0&&y<MaxN)
{
x=nowx-1;
if(x>=0&&x<MaxM)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
x=nowx;
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy,0);
x=nowx+1;
if(x>=0&&x<MaxM)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
}
}//addx==0&&addy==1
else if(addy==-1)//需要处理右一列
{
y=nowy+1;
if(y>=0&&y<MaxN)
{
x=nowx-1;
if(x>=0&&x<MaxM)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
x=nowx;
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy,0);
x=nowx+1;
if(x>=0&&x<MaxM)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
}
}//addx==0&&addy==-1
}//else if(addx==0) 父节点与子节点在同一行
//父节点在上一行(addx==-1)
else
{
if(addy==1)//父节点在右上位置,需要处理的节点有下一行和左一列
{
//处理下一行
x=nowx+1;
if(x>=0&&x<MaxM)
{
y=nowy-1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
y=nowy;
new KExtendDemo (environ,x,y,distance1,open,nowx,nowy,0);
y=nowy+1;
if(y>=0&&y<MaxN)
new KExtendDemo (environ,x,y,distance2,open,nowx,nowy);
}//下一行处理完毕
//处理左边节点
y=nowy-1;
if(y>=0&&y<MaxN)
{
x=no
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![text/x-c++](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 14 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/0c631f7811c94826996c8f8fc9e20795_gzm888888.jpg!1)
GZM888888
- 粉丝: 212
- 资源: 2971
![benefits](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-1.c8e153b4.png)
下载权益
![privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-2.ec46750a.png)
C知道特权
![article](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-3.fc5e5fb6.png)
VIP文章
![course-privilege](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-4.320a6894.png)
课程特权
![rights](https://csdnimg.cn/release/downloadcmsfe/public/img/vip-rights-icon.fe0226a8.png)
开通VIP
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 400张高清宣纸纹理底纹素材古典中国风
- 酒店机票价格非常的便宜三
- TM2301FN-VB一款SOT23封装P-Channel场效应MOS管
- Java项目-基于SSM+JSP的网上订餐系统的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件)
- 基于51单片机的DS1302与LCD1602设计的智能电子钟 闰年自动判断
- 酒店机票价格非常的便宜二
- 基于python的网络爬虫爬取天气数据及可视化分析python大作业(源码+教程)
- Java项目-基于SSM+Jsp的高校校园点餐系统的设计与实现(源码+数据库脚本+部署视频+代码讲解视频+全套软件)
- 反向编译 ★逆向工程★工具包【TOP升级版】v24.07
- 酒店机票价格非常的便宜一
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)