?? new_file.cpp
字號:
//////**下面的進一步的設計思想是對change_two[200]數組進行賦值,得到具體的方案**//////
for(int xz4=0;xz4<same2_middle_flag;xz4++)
{
change_two[xz4].my_id=xz4;////對change_two[200]的id進行賦值
strcpy(change_two[xz4].change_line2,same2_middle[xz4]);////對change_two[200]的中轉公交線路進行賦值
////**以下是查詢中轉公交線路的id值**////
change_two[xz4].change_id2=return_bus_id(same2_middle[xz4]);////得到了中間一路的公交車的id號碼的值
}
change_two_flag=same2_middle_flag;/////change_two_flag表示的是中轉線路的條數
////***根據中轉的公交線路集和起始站所能達到的公交線路集的交點可以得到轉車的地點***////
for(int pyk0=0;pyk0<change_two_flag;pyk0++)////遍歷所有的中間路線的數量
{
change_two[pyk0].begin_to_change1_flag=0;////中轉1站點的數量,起始值為0
change_two[pyk0].end_to_change2_flag=0;////中轉2站點的數量,起始值為0
for(int pyk1=0;pyk1<=bus_line[change_two[pyk0].change_id2].geshu;pyk1++)////遍歷所有中轉路線所經過的站點
{
for(int pyk2=0;pyk2<line_num_flag;pyk2++)/////遍歷所有由起點站可以直接達到的站臺
{
int tmp_pyk;
tmp_pyk=strcmp(line_all[pyk2],bus_line[change_two[pyk0].change_id2].line[pyk1]);
if(tmp_pyk==0)//////如果找到中轉點,則將其計入在起點到中轉的1號中轉站中
{
strcpy(change_two[pyk0].begin_to_change1[change_two[pyk0].begin_to_change1_flag].change_round,line_all[pyk2]);
//**在整個站臺數組中尋找到當前中轉站臺的ID號**//
for(int baby0=0;baby0<=stage_num;baby0++)////遍歷所有的站點
{
int tmp_baby0;
tmp_baby0=strcmp(stage[baby0].name,line_all[pyk2]);
if(tmp_baby0==0)/////找到了相同的站點,將ID值賦值進去
{
change_two[pyk0].begin_to_change1[change_two[pyk0].begin_to_change1_flag].change_round_id=stage[baby0].num;
}
}
change_two[pyk0].begin_to_change1_flag++;//////站點的數量變多
}
}
for(int pyk3=0;pyk3<line_num_flag2;pyk3++)/////遍歷所有終點站可以直接到達的站點
{
int tmp_pyk3;
tmp_pyk3=strcmp(line_all2[pyk3],bus_line[change_two[pyk0].change_id2].line[pyk1]);
if(tmp_pyk3==0)////如果找到交點,將其計入到終點到中轉2的站點數組中
{
strcpy(change_two[pyk0].end_to_change2[change_two[pyk0].end_to_change2_flag].change_round,line_all2[pyk3]);
for(int son0=0;son0<=stage_num;son0++)/////比較中轉2站點和所有的站臺庫
{
int tmp_son0;
tmp_son0=strcmp(line_all2[pyk3],stage[son0].name);
if(tmp_son0==0)////找到相同的站點,將ID值進入
{
change_two[pyk0].end_to_change2[change_two[pyk0].end_to_change2_flag].change_round_id=stage[son0].num;
}
}
change_two[pyk0].end_to_change2_flag++;
}
}
}
}
////測試 cout<<"第一條公交線路為"<<change_two[2].change_line2<<",她的經過的兩個 站點分別為"<<change_two[2].begin_to_change1[0].change_round<<"第二個為"<<change_two[2].end_to_change2[0].change_round<<endl;
/////////**到現在為止,得到了兩個中轉站的站點的名稱和兩個中轉站之間的路線,下一步是要得到起點到中轉1和終點到中轉2的公交車的ID號**//////////
///**由上面可以得到起點車站的id號為begin_stage,,終點車站的id號為end_stage**///
///*下面的程序的設計思想是,在站臺庫中找到中轉1的站臺的id號,所經過這個站點的公交線路與起始站的公交線路的交集就是起點到中轉1的公交路線,可能有多個*///
/////**遍歷所有的中間路線,對于每一個中間路線而言要遍歷其所有的中轉站點,對于每一個中轉站點要遍歷其所有的經過的公交線路,再與經過起始站點的公交路線相比較**////
for(int pyk4=0;pyk4<change_two_flag;pyk4++)//////遍歷所有的中間路線
{
/////////**起點到中轉1部分的程序**//////////
for(int pyk5=0;pyk5<change_two[pyk4].begin_to_change1_flag;pyk5++)/////遍歷所有的以本條公交線為中轉的所有起點到中轉1的方案
{
change_two[pyk4].begin_to_change1[pyk5].change_line_num=0;
for(int pyk6=0;pyk6<stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].line_in;pyk6++)////遍歷中轉站的所有經過的路線值
{
for(int pyk7=0;pyk7<stage[begin_stage].line_in;pyk7++)////遍歷所有的起點站點所經過的路線
{
int tmp_pyk7;
tmp_pyk7=strcmp(stage[begin_stage].biaoji[pyk7].way,stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].biaoji[pyk6].way);
if(tmp_pyk7==0)//////找到中轉1與起點所共有的公交路線
{
strcpy(change_two[pyk4].begin_to_change1[pyk5].change_line_name[change_two[pyk4].begin_to_change1[pyk5].change_line_num],stage[begin_stage].biaoji[pyk7].way);////賦值到公交線路
change_two[pyk4].begin_to_change1[pyk5].change_line_id[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=return_bus_id(stage[begin_stage].biaoji[pyk7].way);/////賦值與本條線路所對應的ID值
change_two[pyk4].begin_to_change1[pyk5].qidian_stage_num[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=stage[begin_stage].biaoji[pyk7].num;//////記錄起點在本條起點到中轉1的公交路線中對應的站號
change_two[pyk4].begin_to_change1[pyk5].zhongdian_stage_num[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].biaoji[pyk6].num;//////記錄中轉站1在本條起點到中轉1的站號
change_two[pyk4].begin_to_change1[pyk5].distance[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=abs(stage[begin_stage].biaoji[pyk7].num-stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].biaoji[pyk6].num);////賦值兩者所差的距離值
change_two[pyk4].begin_to_change1[pyk5].change_line_num++;////得到的由起點到中轉1的路線的數量變多
}
}
}
}
//////**終點到中轉2部分的程序**//////
for(int pyk8=0;pyk8<change_two[pyk4].end_to_change2_flag;pyk8++)//////遍歷所有此中轉線對應的中轉2的可能數目
{
change_two[pyk4].end_to_change2[pyk8].change_line_num=0;
for(int pyk9=0;pyk9<stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].line_in;pyk9++)////遍歷所有的經過中轉2的路線
{
for(int pyk10=0;pyk10<stage[end_stage].line_in;pyk10++)///遍歷所有經過終點的路線
{
int tmp_pyk10;
tmp_pyk10=strcmp(stage[end_stage].biaoji[pyk10].way,stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].biaoji[pyk9].way);
if(tmp_pyk10==0)////比較得到了中轉2到終點相同的公交路線
{
strcpy(change_two[pyk4].end_to_change2[pyk8].change_line_name[change_two[pyk4].end_to_change2[pyk8].change_line_num],stage[end_stage].biaoji[pyk10].way);
change_two[pyk4].end_to_change2[pyk8].change_line_id[change_two[pyk4].end_to_change2[pyk8].change_line_num]=return_bus_id(stage[end_stage].biaoji[pyk10].way);////賦值與本條路線所對應的ID值
change_two[pyk4].end_to_change2[pyk8].qidian_stage_num[change_two[pyk4].end_to_change2[pyk8].change_line_num]=stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].biaoji[pyk9].num;///////記錄在中轉2到終點的公交線路中的起點(中轉2)的站臺號
change_two[pyk4].end_to_change2[pyk8].zhongdian_stage_num[change_two[pyk4].end_to_change2[pyk8].change_line_num]=stage[end_stage].biaoji[pyk10].num;////得到了終點在中轉2到終點的公交線路中的站臺號
change_two[pyk4].end_to_change2[pyk8].distance[change_two[pyk4].end_to_change2[pyk8].change_line_num]=abs(stage[end_stage].biaoji[pyk10].num-stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].biaoji[pyk9].num);
change_two[pyk4].end_to_change2[pyk8].change_line_num++;
}
}
}
}
/////////***到現在為止已經得到了由一條中間線路得到的起始線和終了線所應該乘坐的公交線路***/////////
}
////////**程序的主體算法已經完成,下面將所得到的結果整理后到final_out數組中便于輸出,標記為final_out_flag**///////
for(int yml0=0;yml0<change_two_flag;yml0++)////遍歷所有的中間路線
{
for(int yml1=0;yml1<change_two[yml0].begin_to_change1_flag;yml1++)/////遍歷所有的這一條中間線路的可能中轉1站點
{
for(int yml2=0;yml2<change_two[yml0].end_to_change2_flag;yml2++)////遍歷所有對應于這一條中間線路的中轉2站點,此時兩個中轉站已經確定下來了
{
for(int yml3=0;yml3<change_two[yml0].begin_to_change1[yml1].change_line_num;yml3++)////對應于同一個zhongzhuan1,遍歷起點到中轉1的所有可能公交路線
{
for(int yml4=0;yml4<change_two[yml0].end_to_change2[yml2].change_line_num;yml4++)//////對應于同一個zhongzhuan2,遍歷終點到中轉2的所有可能公交路線
{
int use_for_tmp0;////中轉1在stage數組中的ID號
int use_for_tmp1;////中轉2在stage數組鐘的ID號
int use_for_tmp2;/////得到的是中轉1在中轉公交線路中的位置值
int use_for_tmp3;/////得到的是中轉2在中轉公交線路中的位置值
strcpy(final_out[final_out_flag].zhongzhuan1_stage,change_two[yml0].begin_to_change1[yml1].change_round);////將中轉1的站點值進入final_out數組
strcpy(final_out[final_out_flag].zhongzhuan2_stage,change_two[yml0].end_to_change2[yml2].change_round);/////將中轉2的站點值進入final_out數組
strcpy(final_out[final_out_flag].begin_to_zhongzhuan1,change_two[yml0].begin_to_change1[yml1].change_line_name[yml3]);///將起點到中轉1所要乘坐的公交線路的名稱進入final_out數組
final_out[final_out_flag].begin_to_zhongzhuan1_begin_num=change_two[yml0].begin_to_change1[yml1].qidian_stage_num[yml3];//////將起點在整個起點到中轉1的公交線路中的站牌號賦值進入
final_out[final_out_flag].begin_to_zhongzhuan1_end_num=change_two[yml0].begin_to_change1[yml1].zhongdian_stage_num[yml3];//////將中轉1在整個起點到中轉1的公交線路中的站牌號賦值進入final_out結構體數組
// final_out[final_out_flag].begin_to_zhongzhuan1_id=return_bus_id(final_out[final_out_flag].begin_to_zhongzhuan1);/////返回起點到中轉1的公交路線ID值
strcpy(final_out[final_out_flag].zhongzhuan2_to_end,change_two[yml0].end_to_change2[yml2].change_line_name[yml4]);/////將中轉2到終點所要乘坐的公交車進入final_out數組
final_out[final_out_flag].zhongzhuan2_to_end_begin_num=change_two[yml0].end_to_change2[yml2].qidian_stage_num[yml4];/////將中轉2這個站臺在整個中轉2到終點的公交線路中的站牌號進入final_out結構體數組
final_out[final_out_flag].zhongzhuan2_to_end_end_num=change_two[yml0].end_to_change2[yml2].zhongdian_stage_num[yml4];//////將終點在整個中轉2到終點的公交線路中的站牌號進入final_out結構體數組
// final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_id=return_bus_id(final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2);/////返回中轉1到中轉2的公交路線ID值
strcpy(final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2,change_two[yml0].change_line2);/////得到了中轉1到中轉2的公交路線的名字
final_out[final_out_flag].my_id=final_out_flag;/////將ID值得到
final_out[final_out_flag].begin_to_zhongzhuan1_stage_flag=change_two[yml0].begin_to_change1[yml1].distance[yml3];////起點到中轉1所要經過的距離知道了
// final_out[final_out_flag].zhongzhuan2_to_end_id=return_bus_id(final_out[final_out_flag].zhongzhuan2_to_end);///返回中轉2到終點的公交線路的ID值
final_out[final_out_flag].zhongzhuan2_to_end_stage_flag=change_two[yml0].end_to_change2[yml2].distance[yml4];////記錄從中轉2到終點所要經過的站臺數量
////**下面的這段函數的作用是得到中轉1到中轉2的所經過的距離以及之間的公交站點的名字存放到final_out數組中**////
use_for_tmp0=return_stage_id(change_two[yml0].begin_to_change1[yml1].change_round);/////得到了中轉1的id號
use_for_tmp1=return_stage_id(change_two[yml0].end_to_change2[yml2].change_round);/////得到了中轉2的ID號
////***首先得到的是中轉1 對應于這個中間路線上所處的位置***////
for(int yml5=0;yml5<=stage[use_for_tmp0].line_in;yml5++)
{
int tmp_yml5;
tmp_yml5=strcmp(stage[use_for_tmp0].biaoji[yml5].way,change_two[yml0].change_line2);
if(tmp_yml5==0)/////通過比較得到了此站點在這一條中間路線上,由此得到他在中間路線上的位置
{
use_for_tmp2=stage[use_for_tmp0].biaoji[yml5].num;
}
}
///**得到中轉2對應于這一條中間路線上的位置**///
for(int yml6=0;yml6<=stage[use_for_tmp1].line_in;yml6++)
{
int tmp_yml6;
tmp_yml6=strcmp(stage[use_for_tmp1].biaoji[yml6].way,change_two[yml0].change_line2);
if(tmp_yml6==0)
{
use_for_tmp3=stage[use_for_tmp1].biaoji[yml6].num;
}
}
final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_begin_num=use_for_tmp2;/////得到了中轉1在本條中轉1到中轉2的公交路線中的站牌號
final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_end_num=use_for_tmp3;/////得到了中轉2在本條中轉1到中轉2的公交線路中的站牌號
final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_stage_flag=abs(use_for_tmp2-use_for_tmp3);/////得到了兩個中轉站之間需要經過的站臺的數量
final_out[final_out_flag].begin_to_end_distance=final_out[final_out_flag].begin_to_zhongzhuan1_stage_flag+final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_stage_flag+final_out[final_out_flag].zhongzhuan2_to_end_stage_flag;/////總共經過的距離為起點到中轉1+中轉1到中轉2+中轉2到終點
final_out_flag++;///////可選的起點到終點的方案變多了
}
}
}
}
}
///**下面將得到的起點到終點的站臺的總數目按從小到大的順序排列,從而得到最終結果**//
for(int sdl0=0;sdl0<final_out_flag;sdl0++)
{
for(int sdl1=0;sdl1<final_out_flag;sdl1++)
{
two_to_out tmp_use;
if(final_out[sdl0].begin_to_end_distance<final_out[sdl1].begin_to_end_distance)/////如果要比較的第一個值大于后來的值,則后移
{
tmp_use=final_out[sdl0];
final_out[sdl0]=final_out[sdl1];
final_out[sdl1]=tmp_use;///////交換
}
}
}
cout<<"從起點到終點的所有可選方案有"<<final_out_flag<<"種"<<endl;
for(int peijian0=0;peijian0<101;peijian0++)///////由于DOS界面輸出會翻頁,下一步要做的是將其輸出到當前目錄的txt下,解決這個問題
{ cout<<"第"<<peijian0+1<<"種路徑為:"<<endl;
cout<<"坐->"<<final_out[peijian0].begin_to_zhongzhuan1<<"到->"<<final_out[peijian0].zhongzhuan1_stage<<"下車,坐->"<<final_out[peijian0].zhongzhuan1_to_zhongzhuan2<<"到->"<<final_out[peijian0].zhongzhuan2_stage<<"下車,再乘坐->"<<final_out[peijian0].zhongzhuan2_to_end<<"到終點站,累計"<<final_out[peijian0].begin_to_end_distance<<"站"<<endl;
}
cout<<endl;
cout<<endl;
int my_will;
cout<<"提示: 輸入要選擇的方案編號可以查看具體經過哪些站點,暫時只支持查詢前100種方案,輸入0退出"<<endl;
cin>>my_will;
if(my_will==0)goto labnext;////輸入0退出查詢
if(my_will<101)
{
cout<<"從起點"<<input1<<"出發乘坐"<<final_out[my_will-1].begin_to_zhongzhuan1<<"路,經過"<<final_out[my_will-1].begin_to_zhongzhuan1_stage_flag<<"站,到達中轉1"<<final_out[my_will-1].zhongzhuan1_stage<<"如下所示:"<<endl;
output_stage_with_line(final_out[my_will-1].begin_to_zhongzhuan1_begin_num,final_out[my_will-1].begin_to_zhongzhuan1_end_num,return_bus_id(final_out[my_will-1].begin_to_zhongzhuan1));////輸出從起點到中轉1所要經過的公交站臺的名字
cout<<endl;
cout<<"從第一次中轉到第二次中轉所要坐的公交車為-> "<<final_out[my_will-1].zhongzhuan1_to_zhongzhuan2<<"從"<<final_out[my_will-1].zhongzhuan1_stage<<"出發,經過"<<final_out[my_will-1].zhongzhuan1_to_zhongzhuan2_stage_flag<<"站,到達中轉2"<<final_out[my_will-1].zhongzhuan2_stage<<"如下所示:"<<endl;
output_stage_with_line(final_out[my_will-1].zhongzhuan1_to_zhongzhuan2_begin_num,final_out[my_will-1].zhongzhuan1_to_zhongzhuan2_end_num,return_bus_id(final_out[my_will-1].zhongzhuan1_to_zhongzhuan2));////輸出從起點到中轉1所要經過的公交站臺的名字
cout<<endl;
cout<<"從第二次中轉到終點所要坐的公交車為-> "<<final_out[my_will-1].zhongzhuan2_to_end<<"從"<<final_out[my_will-1].zhongzhuan2_stage<<"出發,經過"<<final_out[my_will-1].zhongzhuan2_to_end_stage_flag<<"站到達終點站"<<input2<<"如下所示:"<<endl;
output_stage_with_line(final_out[my_will-1].zhongzhuan2_to_end_begin_num,final_out[my_will-1].zhongzhuan2_to_end_end_num,return_bus_id(final_out[my_will-1].zhongzhuan2_to_end));////輸出從起點到中轉1所要經過的公交站臺的名字
cout<<endl;////輸出結束
}
else
{
cout<<"輸入的方案查詢有錯誤"<<endl;
}
}
}
labnext: cout<<" 想繼續嗎(Y/N)?"<<endl;
cin>>mind;
if(mind=='Y'||mind=='y')
{
zhongzhuan_counter=0;
line_num_enable=1;
line_num_flag=0;
cross_stage=0;
enable_add=1;
same_counter2=0;
same_counter1=0;
same_counter0=0;
same1_2counter=0;
same1_1counter=0;
correct2=0;
correct1=0;
correct0=0;
end_stage=-1;
begin_stage=-1;
out_enter=0;//////用于經過的站點輸出時的回車輸出
xiao1=0;////臨時的值
xiao0_counter=0;
////** 以下的變量初始化是為了換乘兩次車所準備的 **////
change_two_flag=0;
enable_add2=1;
cross_stage2=0;
line_num_flag2=0;
line_num_enable2=1;
zhongzhuan_counter2=0;
final_out_flag=0;
continue;
}
else
break;
}
/////////////程序完成////////////////
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -