4.25打卡
结对作业迪杰斯特拉
• 所花时间:2
• 代码行数:365
• 博客容量:1
• 代码如下:
package com.example.subway.util;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Dijkstra {
public static int[][] weight=new int[DataBuild.CanTransferStationList.size()+2][DataBuild.CanTransferStationList.size()+2];
public static int weightl=DataBuild.CanTransferStationList.size()+2;
//weight的顺序即CanTransferStationList列表的顺序 只有首尾占不在同一线上才用的到
public static List<Station> result=new ArrayList<Station>();
public static List<Integer> change=new ArrayList<Integer>();//放到达每个站的 前一个换乘站
public static String resultstring=new String();
private static int one=-1;
public static Line inOneLine(Station x,Station y){
int i;
int j;
one=-1;
Line oneLine=new Line();
int d=1000;
for(i=0;i<x.getTansferLine().size();i++){//看他们是否再同一条线上 one
for(j=0;j<y.getTansferLine().size();j++){
if(x.getTansferLine().get(i)==y.getTansferLine().get(j)){
one=1;
oneLine=x.getTansferLine().get(i);
for(Station k:oneLine.getOneLineStation()){
if(k.getName().equals(x.getName())&&k.getInWhichLine()==oneLine&&Math.abs(k.getId()-y.getId())<d){
x=k;
}
if(k.getName().equals(y.getName())&&k.getInWhichLine()==oneLine&&Math.abs(x.getId()-k.getId())<d){
y=k;
}
}
if(Math.abs(x.getId()-y.getId())<d){
d=Math.abs(x.getId()-y.getId());
}
}
}
}
return oneLine;
}
private static int flagSizeOfW=0;
public static void buildWeight(Station start,Station end){
int s=0,e=0;
if(flagSizeOfW==0){//首尾站均不可换乘
s=1;e=1;
}
else if(flagSizeOfW==1){//仅首站均换乘
e=1;
}
else if(flagSizeOfW==2){//仅尾站可换乘
s=1;
}
else if(flagSizeOfW==3){//均可换乘
s=0;e=0;
}
//System.out.println("s: "+s+ " e:"+e );
for(int i=0;i<weightl;i++){
for(int j=0;j<weight.length;j++)
weight[i][j]=1000;
}
weight[0][0]=0;
int i,j;
//0号放start weightl-1号放end
for(i=0+s;i<weightl-e;i++){
weight[i][i]=0;
for(j=i+1;j<DataBuild.CanTransferStationList.size();j++){//
if(i==21&&j==55)
{
weight[i][i]=0;
}
Line l1=inOneLine(DataBuild.CanTransferStationList.get(i),DataBuild.CanTransferStationList.get(j));
if(one==1){
int index1=-1,index2=-1;
for(int k=0;k<l1.getOneLineStation().size();k++){//由站名 在l1中找出 该站
if(index1!=-1&&index2!=-1)
break;
if(l1.getOneLineStation().get(k).getName().equals(DataBuild.CanTransferStationList.get(i).getName())){
index1=k;
}
if(l1.getOneLineStation().get(k).getName().equals(DataBuild.CanTransferStationList.get(j).getName())){
index2=k;
}
}
if(l1.getIsCircle()){
weight[i+s][j+s]=weight[j+s][i+s]=Math.min(l1.getOneLineStation().size()-Math.abs(index1-index2),Math.abs(index1-index2));
}
else
weight[i+s][j+s]=weight[j+s][i+s]=Math.abs(index1-index2);
}
}
}
if(s==1){
for(i=0;i<DataBuild.CanTransferStationList.size();i++){
Line l1=inOneLine(start,DataBuild.CanTransferStationList.get(i));
if(one==1){
int index1=-1,index2=-1;
for(j=0;j<l1.getOneLineStation().size();j++){
if(l1.getOneLineStation().get(j).getName().equals(DataBuild.CanTransferStationList.get(i).getName())){
index1=l1.getOneLineStation().get(j).getId();
}
if(l1.getOneLineStation().get(j).getName().equals(start.getName())){
index2=l1.getOneLineStation().get(j).getId();
}
}
if(l1.getIsCircle()){
weight[0][1+i]=weight[1+i][0]=Math.min(Math.abs(index1-index2),l1.getOneLineStation().size()-Math.abs(index1-index2));
}
else
weight[0][1+i]=weight[1+i][0]=Math.abs(index1-index2);
}
}
}
if(e==1){
Line l1=inOneLine(end,DataBuild.CanTransferStationList.get(0));
if(one==1){
int index1=-1,index2=-1;
for(j=0;j<l1.getOneLineStation().size();j++){
if(l1.getOneLineStation().get(j).getName().equals(DataBuild.CanTransferStationList.get(0).getName())){
index1=l1.getOneLineStation().get(j).getId();
}
if(l1.getOneLineStation().get(j).getName().equals(end.getName())){
index2=l1.getOneLineStation().get(j).getId();
}
}
if(l1.getIsCircle()){
weight[weightl-1][0]=weight[0][weightl-1]=Math.min(Math.abs(index1-index2),l1.getOneLineStation().size()-Math.abs(index1-index2));
}
else
weight[weightl-1][0]=weight[0][weightl-1]=Math.abs(index1-index2);
}
for(i=0;i<DataBuild.CanTransferStationList.size();i++){
l1=inOneLine(end,DataBuild.CanTransferStationList.get(i));
if(one==1){
int index1=-1,index2=-1;
for(j=0;j<l1.getOneLineStation().size();j++){
if(l1.getOneLineStation().get(j).getName().equals(DataBuild.CanTransferStationList.get(i).getName())){
index1=l1.getOneLineStation().get(j).getId();
}
if(l1.getOneLineStation().get(j).getName().equals(end.getName())){
index2=l1.getOneLineStation().get(j).getId();
}
}
if(l1.getIsCircle()){
weight[weightl-1][i+s]=weight[i+s][weightl-1]=Math.min(Math.abs(index1-index2),l1.getOneLineStation().size()-Math.abs(index1-index2));
}
else
weight[weightl-1][i+s]=weight[i+s][weightl-1]=Math.abs(index1-index2);
}
}
}
}
public static void modiWeight(){
for(int i=0;i<weightl;i++){
change.add(-1);
}
int[] visited=new int[weightl];
for(int v:visited)
visited[v]=0;
visited[0]=1;
for(int i=0;i<weightl;i++){//每次循环 visited一个点
int min=1000;
int posi=0;
for(int j=1;j<weightl;j++){
if(visited[j]==0&&weight[0][j]<min){
min=weight[0][j];
posi=j;
}
}
//System.out.println("选出1个最短:"+min+" posi:"+posi);
visited[posi]=1;
for(int j=0;j<weightl;j++){
if(weight[0][posi]+weight[posi][j]<weight[0][j]&&j!=posi){
//System.out.println("原来:0到"+j+"是"+weight[0][j]);
//System.out.println("更新:0到"+j+weight[0][posi]+"+"+weight[posi][j]);
weight[0][j]=weight[0][posi]+weight[posi][j];
change.set(j, posi);
}
}
}
}
public static void getTransfer(int e,Station es){//change
//System.out.println(flagSizeOfW+"!");
if(change.get(e)==-1){
if(flagSizeOfW==3)
result.add(DataBuild.CanTransferStationList.get(e));
else if(flagSizeOfW==2)
result.add(DataBuild.CanTransferStationList.get(e-1));
else if(flagSizeOfW==1)
result.add(DataBuild.CanTransferStationList.get(e));
else{
result.add(DataBuild.CanTransferStationList.get(e-1));
}
return;
}
if(flagSizeOfW==3){
getTransfer(change.get(e),es);
result.add(DataBuild.CanTransferStationList.get(e));
}
else if(flagSizeOfW==2){//尾可换
getTransfer(change.get(e),es);
result.add(DataBuild.CanTransferStationList.get(e-1));
}
else if(flagSizeOfW==1){//首可换
getTransfer(change.get(e),es);
if(e<55)
result.add(DataBuild.CanTransferStationList.get(e));
else result.add(es);
}
else if(flagSizeOfW==0){//都不可换乘
getTransfer(change.get(e),es);
if(e>0&&e<=56){
result.add(DataBuild.CanTransferStationList.get(e-1));
}
else result.add(es);
}
}
public static void getEveryStation(){
Line ll2=new Line();
for(int i=0;i<result.size()-1;i++){
Line ll=inOneLine(result.get(i),result.get(i+1));
int dis;
int dir;
for(int j=0;j<DataBuild.stationList.size();j++){
if(DataBuild.stationList.get(j).getName().equals(result.get(i).getName())&&DataBuild.stationList.get(j).getInWhichLine().getName().equals(ll.getName())){
result.set(i,DataBuild.stationList.get(j) );
}
if(DataBuild.stationList.get(j).getName().equals(result.get(i+1).getName())&&DataBuild.stationList.get(j).getInWhichLine().getName().equals(ll.getName())){
result.set(i+1,DataBuild.stationList.get(j) );
}
}
int index1=result.get(i).getId(),index2=result.get(i+1).getId();
if(index1<index2)
dir=1;
else dir=-1;
if(ll.getIsCircle()){
dis=Math.min(Math.abs(index1-index2),ll.getOneLineStation().size()-Math.abs(index1-index2));
}
else
dis=Math.abs(index1-index2);
if(i!=0&&ll!=ll2){
System.out.print("\n(此站需换乘到)"+ll.getName());
resultstring+="\n(此站需换乘到)"+ll.getName();
}
else if(i==0){
System.out.print("(乘坐)"+ll.getName());
resultstring+="(乘坐)"+ll.getName();
}
ll2=ll;
if(!ll.getIsCircle()){
for(int j=0;j<dis;j++){
System.out.print(ll.getOneLineStation().get(index1+(dir)*j).getName()+"->");
resultstring+=ll.getOneLineStation().get(index1+(dir)*j).getName()+"->";
}
System.out.print(ll.getOneLineStation().get(index2).getName());
resultstring+=ll.getOneLineStation().get(index2).getName();
}
else {//环线
dis=Math.min(Math.abs(index1-index2), ll.getOneLineStation().size()-Math.abs(index1-index2));
if(Math.abs(index1-index2)<=(ll.getOneLineStation().size()-Math.abs(index1-index2))){
if(index1<index2)
dir=1;
else dir=-1;
for(int j=0;j<dis;j++){
System.out.print(ll.getOneLineStation().get((index1+(dir)*j)).getName()+"->");
resultstring+=ll.getOneLineStation().get((index1+(dir)*j)).getName()+"->";
}
System.out.print(ll.getOneLineStation().get(index2).getName());
resultstring+=ll.getOneLineStation().get(index2).getName();
}
else {//要跨越重复站
if(index1<=index2)
dir=-1;
else
dir=1;
if(dir==1){
for(int j=index1;j<ll.getOneLineStation().size();j++){
System.out.print(ll.getOneLineStation().get(j).getName()+"->");
resultstring+=ll.getOneLineStation().get(j).getName()+"->";
}
for(int j=0;j<index2;j++){
System.out.print(ll.getOneLineStation().get((j)).getName()+"->");
resultstring+=ll.getOneLineStation().get((j)).getName()+"->";}
System.out.print(ll.getOneLineStation().get((index2)).getName());
resultstring+=ll.getOneLineStation().get((index2)).getName();
}
else{
for(int j=index1;j>=0;j--){
System.out.print(ll.getOneLineStation().get(j).getName()+"->");
resultstring+=ll.getOneLineStation().get(j).getName()+"->";
}
for(int j=ll.getOneLineStation().size()-1;j>index2;j--){
System.out.print(ll.getOneLineStation().get((j)).getName()+"->");
resultstring+=ll.getOneLineStation().get((j)).getName()+"->";
}
System.out.print(ll.getOneLineStation().get((index2)).getName());
resultstring+=ll.getOneLineStation().get((index2)).getName();
}
}
}
}
}
static void writefile() throws IOException {
FileWriter fileWriter=new FileWriter("/data/data/com.example.subway/files/Result.txt");
fileWriter.write(resultstring+"\n");
fileWriter.flush();
fileWriter.close();
}
public static void getRoad(String s,String e){
weightl=DataBuild.CanTransferStationList.size()+2;
flagSizeOfW=0;
one=-1;
for(int i=0;i<weight.length;i++){
for(int j=0;j<weight.length;j++)
weight[i][j]=1000;
}
weight[0][0]=0;
result.clear();
change.clear();
int i=0;
Station start=new Station();
Station end=new Station();
int gets=0,gete=0;
for(i=0;i<DataBuild.stationList.size();i++){
if(gets==1&&gete==1){
break;
}
if(DataBuild.stationList.get(i).getName().equals(s)){
start=DataBuild.stationList.get(i);
gets=1;
}
if(DataBuild.stationList.get(i).getName().equals(e)){
end=DataBuild.stationList.get(i);
gete=1;
}
}
if(i>=DataBuild.stationList.size())
{
System.out.println("输入有误!");
return;
}
// try{
// System.out.print(start.getName());
//
// }catch(NullPointerException exce){
// System.out.print("输入错误!");
// }
//已取得首战 尾站。
// for(i=0;i<DataBuild.CanTransferStationList.size();i++)
// System.out.print(DataBuild.CanTransferStationList.get(i).getName()+" ");
// System.out.println();
//查明 首尾站是否尾可换乘站
for(i=0;i<DataBuild.CanTransferStationList.size();i++){
if(flagSizeOfW==3)
break;
if(start.getName().equals(DataBuild.CanTransferStationList.get(i).getName())&&flagSizeOfW!=1){
Station t=DataBuild.CanTransferStationList.get(0);
DataBuild.CanTransferStationList.set(0, DataBuild.CanTransferStationList.get(i));
DataBuild.CanTransferStationList.set(i, t);
weightl-=1;
flagSizeOfW+=1;
}
if(end.getName().equals(DataBuild.CanTransferStationList.get(i).getName())&&flagSizeOfW!=2){
Station t=DataBuild.CanTransferStationList.get(DataBuild.CanTransferStationList.size()-1);
DataBuild.CanTransferStationList.set(DataBuild.CanTransferStationList.size()-1, DataBuild.CanTransferStationList.get(i));
DataBuild.CanTransferStationList.set(i, t);
weightl-=1;
flagSizeOfW+=2;
}
}
// System.out.println("wei:"+weightl);
// System.out.println("can:"+DataBuild.CanTransferStationList.size());
buildWeight(start,end);
//查看weight矩阵
// for(i=0;i<weightl;i++){
// for(int j=0;j<weightl;j++)
// System.out.print(String.format("%4d ", weight[i][j]));
// System.out.println();
// }
//查看cantransfer站名
// for(i=0;i<DataBuild.CanTransferStationList.size();i++)
// System.out.print(DataBuild.CanTransferStationList.get(i).getName()+" ");
// System.out.println(end.getName());
result.add(start);
int s1=0, e1=0;
if(flagSizeOfW==0){//首尾站均不可换乘58
s1=1;e1=1;
}
else if(flagSizeOfW==1){//仅首站换乘57
e1=1;
}
else if(flagSizeOfW==2){//仅尾站可换乘57
s1=1;
}
else if(flagSizeOfW==3){//均可换乘56
e1=0;s1=0;
}
modiWeight();
if(weight[0][weightl-1]==1000){
System.out.println("无直达路线!");
return;
}
// for(int j=0;j<weightl;j++)System.out.print(String.format("%4d ", weight[0][j]));
// System.out.println();
////
if(change.get(weightl-1)==-1){//不用换乘
result.add(end);
}
else
getTransfer(weightl-1,end);
// for(i=0;i<result.size();i++)
// System.out.print(i+":"+change.get(i)+" ");
// System.out.println();
// System.out.print("result:");
// for(i=0;i<result.size();i++)
// System.out.print(result.get(i).getName()+" ");
// System.out.println();
if(end.getName().equals(start.getName())){
System.out.println("共乘坐"+0+"站");
resultstring+="共乘坐0站";
}
else{
System.out.println("共乘坐"+(weight[0][weightl-1]+1)+"站");
resultstring+="共乘坐"+(weight[0][weightl-1]+1)+"站";
}
getEveryStation();
System.out.println();
resultstring+="\n-------\n";
try {
writefile();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
线路
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 积水潭 鼓楼大街 安定门 雍和宫 东直门 东四十条 朝阳门 建国门 北京站 崇文门 前门 和平门 宣武门 长椿街 复兴门 阜成门 车公庄 西直门
4号线大兴线 安河桥北 北宫门 西苑 圆明园 北京大学东门 中关村 海淀黄庄 人民大学 魏公村 国家图书馆 动物园 西直门 新街口 平安里 西四 灵境胡同 西单 宣武门 菜市口 陶然亭 北京南站 马家堡 角门西 公益西桥 新宫 西红门 高米店北 高米店南 枣园 清源路 黄村西大街 黄村火车站 义和庄 生物医药基地 天宫院
5号线 天通苑北 天通苑 天通苑南 立水桥 立水桥南 北苑路北 大屯东路 惠新四街北口 惠新四街南口 和平西桥 和平里北街 雍和宫 北新桥 张自忠路 东四 灯市口 东单 崇文门 磁器口 天坛东门 蒲黄榆 刘家窑 宋家庄
6号线 海淀五路居 慈寿寺 花园桥 白石桥南 车公庄西 车公庄 平安里 北海北 南锣鼓巷 东四 朝阳门 东大桥 呼家楼 金台路 十里堡 青年路 褡裢坡 黄渠 常营 草房 物资学院路 通州北关 北运河西 郝家府 东夏园 潞城
7号线 北京西站 湾子 达官营 广安门内 菜市口 虎坊桥 珠市口 桥湾 磁器口 广渠门内 广渠门外 九龙山 大郊亭 百子湾 化工 南楼梓庄 欢乐谷景区 双合 焦化厂
8号线 朱辛庄 育知路 平西府 回龙观东大街 霍营 育新 西小口 永泰庄 林萃桥 森林公园南门 奥林匹克公园 奥林中心 北土城 安华桥 安德里北街 鼓楼大街 什刹海 南锣鼓巷 中国美术馆
8号线南段 珠市口 天桥 永定门外 木樨园 海户屯 大红门南 和义 东高地 火箭万源 五福堂 德茂 瀛海
9号线 郭公庄 丰台科技园 科怡路 丰台南路 丰台东大街 七里庄 六里桥 六里桥东 北京西站 军事博物馆 白堆子 白石桥南 国家图书馆
10号线 巴沟 苏州街 海淀黄庄 知春里 知春路 西土城 牡丹园 健德门 北土城 安贞门 惠新西街南口 芍药居 太阳宫 三元桥 亮马桥 农业展览馆 团结湖 呼家楼 金台夕照 国贸 双井 劲松 潘家园 十里河 分钟寺 成寿寺 宋家庄 石榴庄 大红门 角门东 角门西 草桥 纪家庙 首经贸 丰台站 泥洼 西局 六里桥 莲花桥 公主坟 西钓鱼台 慈寿寺 车道沟 长春桥 火器营 巴沟
13号线 西直门 大钟寺 知春路 五道口 上地 西二旗 龙泽 回龙观 霍营 立水桥 北苑 望京西 芍药居 光熙门 柳芳 东直门
14号线东段 善各庄 来广营 东湖渠 望京 阜通 望京南 将台 东风北桥 枣营 朝阳公园 金台路 大望路 九龙山 平乐园 北工大西门 十里河 方庄 蒲黄榆 景泰 永定门外 北京南站
14号线西段 西局 七里庄 大井 郭庄子 大瓦窑 园博园 张郭庄
15号线 俸伯 顺义 石门 南法信 后沙峪 花梨坎 国展 孙河 马泉营 崔各庄 望京东 望京 望京西 关庄 大屯路东 安立路 奥林匹克公园 北沙滩 六道口 清华东路西口
16号线 北安河 温阳路 稻香湖路 屯佃 永丰 永丰南 西北旺 马连洼 农大南路 西苑
八通线 四惠 四惠东 高碑店 传媒大学 双桥 管庄 八里桥 通州北苑 果园 九棵树 梨园 临河里 土桥
昌平线 昌平西山口 十三陵景区 昌平 昌平东关 北邵洼 南邵 沙河高教园 沙河 巩华城 朱辛庄 生命科学园 西二旗
房山线 阎村东 苏庄 良乡南关 良乡大学城西 良乡大学城 良乡大学城北 广阳城 篱笆房 长阳 稻田 大葆台 郭公庄
首都机场线 T3航站楼 T2航站楼 三元桥 东直门
西郊线 巴沟 颐和园西门 茶棚 万安 植物园 香山
燕房线 阎村东 紫草坞 阎村 星城 大石河东 马各庄 饶乐府 房山城关 燕山
亦庄线 宋家庄 肖村 小红门 旧宫 亦庄桥 亦庄文化园 万源街 荣京东街 荣昌东街 同济南路 经海路 次渠南 次渠 亦庄火车站
浙公网安备 33010602011771号