本算法解决点阵的路由选择问题,有点类似于计算出乘公交车从一点到另一点所有路由的算法。
问题描述如下:
图上显示了6个点以及点和点之间的路径,现在给出任意两点,求从一点到另外一点的所有可能路由。
代码分析如下,整个项目文件可从附件下载:
Point类,描述每个点,以及其相关点
package com.yingxia.routealgorithm;
import java.util.List;
public class Point {
private Integer gid;
private String name;
private List<Point> points;
public Integer getGid() {
return gid;
}
public void setGid(Integer gid) {
this.gid = gid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Point> getPoints() {
return points;
}
public void setPoints(List<Point> points) {
this.points = points;
}
@Override
public boolean equals(Object obj) {
Point p = (Point) obj;
return this.getGid().equals(p.getGid());
}
}
Route类
package com.yingxia.routealgorithm;
import java.util.LinkedList;
@SuppressWarnings("serial")
public class Route extends LinkedList<Point> {
}
Algorithm核心算法类,用了递归算法,注意递归终止的条件是环路或者到达终点。Dao类的实现请看附件,我用的是postgres数据库,在db.sql中附带了建表和插入数据的sql语句。
package com.yingxia.routealgorithm;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Algorithm {
private Dao dao;
public Algorithm() {
dao = new Dao();
}
private List<Route> routes;
@SuppressWarnings("unchecked")
public List<Route> queryRoutes(Point p1, Point p2) {
routes = new ArrayList<Route>();
Route route = new Route();
route.add(p1);
recursive(p1, p2, route);
Collections.sort(routes, new Comparator(){
@Override
public int compare(Object arg0, Object arg1) {
Route r1 = (Route) arg0;
Route r2 = (Route) arg1;
if(r1.size() < r2.size()) {
return -1;
}
if(r1.size() > r2.size()) {
return 1;
}
return 0;
}}
);
return routes;
}
private void recursive(Point p, Point endPoint, Route route) {
fillPointsField(p);
for(Point nextP : p.getPoints()) {
// route splited
Route splitedRoute = new Route();
splitedRoute.addAll(route);
splitedRoute.add(nextP);
// circle route, abandoned
if(isPointOnRoute(nextP, route)) {
}
// reach end point
else if(nextP.equals(endPoint)) {
routes.add(splitedRoute);
}
// recursive
else {
recursive(nextP, endPoint, splitedRoute);
}
}
}
private void fillPointsField(Point p) {
dao.fillPointsField(p);
}
private boolean isPointOnRoute(Point p, Route route) {
for(Point point : route) {
if(point.equals(p)) {
return true;
}
}
return false;
}
public Dao getDao() {
return dao;
}
public void setDao(Dao dao) {
this.dao = dao;
}
}
Main测试类
package com.yingxia.routealgorithm;
import java.util.List;
public class Main {
public static void main(String[] args) {
Algorithm algorithm = new Algorithm();
Point p1 = new Point();
p1.setGid(1);
p1.setName("纺机厂");
Point p2 = new Point();
p2.setGid(6);
p2.setName("韦博英语");
List<Route> routes = algorithm.queryRoutes(p1, p2);
printout(routes);
p1.setGid(2);
p1.setName("小东门");
p1.setPoints(null);
p2.setGid(4);
p2.setName("花园街");
p2.setPoints(null);
routes = algorithm.queryRoutes(p1, p2);
printout(routes);
}
public static void printout(List<Route> routes) {
System.out.println("路由共有" + routes.size() + "条:");
for(Route route : routes) {
for(Point p : route) {
System.out.print(p.getName() + "\t");
}
System.out.println();
}
System.out.println();
}
}
测试输出如下:
路由共有3条:
纺机厂 三孝口 韦博英语
纺机厂 小东门 栖巢咖啡 三孝口 韦博英语
纺机厂 小东门 花园街 三孝口 韦博英语
路由共有3条:
小东门 花园街
小东门 纺机厂 三孝口 花园街
小东门 栖巢咖啡 三孝口 花园街
个人感觉这种算法点阵一多就会效率很低,如果朋友们有什么好的方法,告诉我,谢谢。
- 大小: 13.9 KB
分享到:
相关推荐
LED点阵屏显示算法,包含左移、右移、上移、下移、激光、画卷、雪花、跑马灯等特效。全部代码用C语言写成,本意是用在嵌入式设备上,但是算法部分与显示部分是独立的,所以理论上可运行在支持ANSI C编译器的任何平台...
16*64点阵滚动显示汉字原理图及算法,PRTEUS仿真
拼合算法,歌斯图算法
这是一个简单的LED屏幕显示算法。它最初用于带有 LED 显示面板的微控制器 (EFM32)。虽然这个项目由于商业原因没有量产,但该算法已经过测试是可靠的。为了抽象算法,我把硬件相关的部分拿出来,加了一个模拟器,可以...
失量转点阵字体,点阵字体的格式支持8*8 16*16 24* 24 32*32 48*48 64*64 128*128
void Line(unsigned char s_x,unsigned char s_y,unsigned char e_x,unsigned char e_y) { char Offset_x,Offset_y,Offset_k = 0; char Err_d = 1; if(s_y>e_y) { Offset_x = s_x; s_x = e_x;...
同时,采用动态点阵匹配算法(DMPLS)进行错误补偿,解决了由连续语音识别器产生的插入、删除和替换错误而导致识别准确率下降的问题,提高了系统的检出率和鲁棒性。实验结果表明,该模型不仅在较低误警率的条件下检出率...
AVR移位算法详细解释 AVR移位算法详细解释 AVR移位算法详细解释
LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模LED点阵字模...
一种4扫户外屏的算法,主要实现左移和静态显示
包括应用程序、完整源代码、工程文件。对于研究使用汉字点阵和在LED上显示调用等很有借鉴意义。
灰度图像和彩色图像关于水平和垂直的镜像
gbk 16*16的点阵,带 偏移算法,包含 2个字符区的偏移算法 还有带资源文件
点阵宋体
俄罗斯点阵字库,适用于点阵屏及打印类驱动显示
使用SAD方法对校正后左右图像进行立体配,没有opencv中sgbm,bm的效果好,但可以看一下算法原理的实现方法
标准12点阵字库与16点阵字库
点阵应用.ppt点阵应用.ppt点阵应用.ppt
16*16点阵左移。这时一个简单的LED点阵16*16的测试程序