⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 两次换乘.cpp

📁 07高教杯数学建模b题之北京公交车查询系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		fgets(road[i].Roadway_Name,5,fp2);
		fseek(fp2,1L,1);
		road[i].Charge_Mode=fgetc(fp2);
		fseek(fp2,1L,1);
		for(j=1; ;j++)
		{
			fgets(cc,5,fp2);
			if(atoi(cc)!=0)
			{
				strcpy(road[i].Stop_Name[j],cc);
				fseek(fp2,1L,1);				
			}
			else
				break;
		}
		road[i].Stop_Amount=j-1;
		fseek(fp2,(87-j)*5+2L,1);
	}
	if(Find_Tow_Stop_Road(start,end)==1)
	{
	/*	int u=1,Amount;
		Amount=line[1].Stop_Amount;
		for(u=2;line[u].Stop_Amount!=0;u++)
		{
			if(line[u].Stop_Amount<Amount)
				Amount=line[u].Stop_Amount;
		}*/

		for(int m=1;m<=l;m++)
		{
			line1[m].Change_Amount=line[k-l+m].Change_Amount;
			line1[m].Stop_Amount=line[k-l+m].Stop_Amount;
			strcpy(line1[m].Stop_1,line[k-l+m].Stop_1);
			strcpy(line1[m].Stop_2,line[k-l+m].Stop_2);
			strcpy(line1[m].Way_1,line[k-l+m].Way_1);
		}

		ss1=line1[1].Stop_Amount*line1[1].Change_Amount;
		//ss2=line5[1].Change_Amount;
		for(int ii=2;ii<m;ii++)
		{	
			if(line1[ii].Stop_Amount*line1[ii].Change_Amount<=ss1)
			{	
				ss1=line1[ii].Stop_Amount*line1[ii].Change_Amount;
				//ss1=line5[ii].Stop_Amount;	
				
			}
		}
		printf("最优路径有:\n");
		int nn=0;
		for(q=1;q<m;q++)
			//if(line1[q].Stop_Amount*line1[q].Change_Amount<=ss1)
			printf("\n第%d条最佳路径:换乘0次,花费%d元,路程%d站\nS%s-%s-S%s\n",++nn,line1[q].Change_Amount,line1[q].Stop_Amount,line1[q].Stop_1,line1[q].Way_1,line1[q].Stop_2);
		ss2=nn;
	}
	else
	{
		for(i=1;i<atoi(start);i++)
		{
			a=a+zhandian[i].n;
		}
		for(j=1;j<atoi(end);j++)
		{
			b=b+zhandian[j].n;
		}
		for(e=a+1;e<=a+zhandian[atoi(start)].n;e++)
		{
			int  n1;
			char tm1[5];
			if(stop[e].Roadway_Name[0]=='D')
			{
				strcpy(tm1,JieQu(stop[e].Roadway_Name,2,3));
				n1=2*atoi(tm1);
				qm=road[n1].Stop_Amount;
			}
			else
			{
				strcpy(tm1,JieQu(stop[e].Roadway_Name,2,3));
				n1=2*atoi(tm1)-1;
				qm=road[n1].Stop_Amount;
			}
			for(q=stop[e].Roadway_No;q<=qm;q++)
			{
				for(r=b+1;r<=b+zhandian[atoi(end)].n;r++)
				{
					int  n2;
					char tm2[5];
					if(stop[r].Roadway_Name[0]=='D')
					{
						strcpy(tm2,JieQu(stop[r].Roadway_Name,2,3));
						n2=2*atoi(tm2);
						wm=road[n2].Stop_Amount;
					}
					else
					{
						strcpy(tm2,JieQu(stop[r].Roadway_Name,2,3));
						n2=2*atoi(tm2)-1;
						wm=road[n2].Stop_Amount;
					}
					for(w=1;w<=stop[r].Roadway_No;w++)
					{
						
						strcpy(aa,road[n1].Stop_Name[q]);
						strcpy(bb,road[n2].Stop_Name[w]);
						if(strcmp(aa,bb)==0 && stop[e].Roadway_No<q && r>stop[r].Roadway_No)//如果两条路有交叉点
						{
							sige1=0;
							for(int p=1;p<=o;p++)
								if(strcmp(aa,line4[p].Stop_2)==0)
								{	
								//	printf("%d\n",o);
									sige1=1;
									break;
								}
							if(sige1==1)
									continue;
							Find_Tow_Stop_Road(start,aa);
							for(m1=1;m1<=l;m1++)
							{
								line1[m1].Change_Amount=line[k-l+m1].Change_Amount;
								line1[m1].Stop_Amount=line[k-l+m1].Stop_Amount;
								strcpy(line1[m1].Stop_1,line[k-l+m1].Stop_1);
								strcpy(line1[m1].Stop_2,line[k-l+m1].Stop_2);
								strcpy(line1[m1].Way_1,line[k-l+m1].Way_1);
							}
						//	k++;
							Find_Tow_Stop_Road(aa,end);	
							for(m2=1;m2<=l;m2++)
							{
								line2[m2].Change_Amount=line[k-l+m2].Change_Amount;
								line2[m2].Stop_Amount=line[k-l+m2].Stop_Amount;
								strcpy(line2[m2].Stop_1,line[k-l+m2].Stop_1);
								strcpy(line2[m2].Stop_2,line[k-l+m2].Stop_2);
								strcpy(line2[m2].Way_1,line[k-l+m2].Way_1);
							}
							for(int t=1;t<m1;t++)
								for(int y=1;y<m2;y++)
								{
									line4[++o].Change_Amount=line1[t].Change_Amount+line2[y].Change_Amount;
									line4[o].Stop_Amount=line1[t].Stop_Amount+line2[y].Stop_Amount;
									strcpy(line4[o].Stop_1,line1[t].Stop_1);
									strcpy(line4[o].Stop_2,line1[t].Stop_2);
									strcpy(line4[o].Way_1,line1[t].Way_1);
									strcpy(line4[o].Way_2,line2[y].Way_1);
									strcpy(line4[o].Stop_3,line2[y].Stop_2);
								}
						//	k++;
							sige=1;
							
						}
					}
				}
			}
		
			
		}
		ss1=line4[1].Stop_Amount*line4[1].Change_Amount;
		//ss2=line5[1].Change_Amount;
		for(int ii=2;ii<=o;ii++)
		{	
			if(line4[ii].Stop_Amount*line4[ii].Change_Amount<=ss1)
			{	
				ss1=line4[ii].Stop_Amount*line4[ii].Change_Amount;
				//ss1=line5[ii].Stop_Amount;	
				
			}
		}
	//	for(int jj=2;jj<=o;jj++)
		//{
		//	if(line4[jj].Change_Amount<ss2)
	//			ss2=line4[jj].Change_Amount;		
	//	}
		int nn=0;
		for(q=1;q<=o;q++)
			if(line4[q].Stop_Amount*line4[q].Change_Amount<=ss1)
			printf("\n第%d条最佳路径:换乘1次,花费%d元,路程%d站\nS%s-%s-S%s-%s-S%s\n",++nn,line4[q].Change_Amount,line4[q].Stop_Amount,line4[q].Stop_1,line4[q].Way_1,line4[q].Stop_2,line4[q].Way_2,line4[q].Stop_3);
			ss2=nn;
		if(sige==0)
		{
		for(e=a+1;e<=a+zhandian[atoi(start)].n;e++)
		{
			int  n1;
			char tm1[5];
			if(stop[e].Roadway_Name[0]=='D')
			{
				strcpy(tm1,JieQu(stop[e].Roadway_Name,2,3));
				n1=2*atoi(tm1);
				qm=road[n1].Stop_Amount;
			}
			else
			{
				strcpy(tm1,JieQu(stop[e].Roadway_Name,2,3));
				n1=2*atoi(tm1)-1;
				qm=road[n1].Stop_Amount;
			}
			for(q=stop[e].Roadway_No;q<=qm;q++)
			{
				for(r=b+1;r<=b+zhandian[atoi(end)].n;r++)
				{
					int  n2;
					char tm2[5];
					if(stop[r].Roadway_Name[0]=='D')
					{
						strcpy(tm2,JieQu(stop[r].Roadway_Name,2,3));
						n2=2*atoi(tm2);
						wm=road[n2].Stop_Amount;
					}
					else
					{
						strcpy(tm2,JieQu(stop[r].Roadway_Name,2,3));
						n2=2*atoi(tm2)-1;
						wm=road[n2].Stop_Amount;
					}
					for(w=1;w<=stop[r].Roadway_No;w++)
					{						
						strcpy(aa,road[n1].Stop_Name[q]);
						strcpy(bb,road[n2].Stop_Name[w]);
						if(Find_Tow_Stop_Road(aa,bb)==1)//&&(strcmp(line5[o].Stop_2,aa)!=0 && strcmp(line5[o].Stop_3,bb)!=0))
						{
							sige1=0;
							for(int p=1;p<=o;p++)
								if(strcmp(aa,line5[p].Stop_2)==0 && strcmp(bb,line5[p].Stop_3)==0)
								{	
									//printf("%d\n",o);
									sige1=1;
									break;
								}
							if(sige1==1)
									continue;
							for(m2=1;m2<=l;m2++)
							{
								line2[m2].Change_Amount=line[k-l+m2].Change_Amount;
								line2[m2].Stop_Amount=line[k-l+m2].Stop_Amount;
								strcpy(line2[m2].Stop_1,line[k-l+m2].Stop_1);
								strcpy(line2[m2].Stop_2,line[k-l+m2].Stop_2);
								strcpy(line2[m2].Way_1,line[k-l+m2].Way_1);
							}
							Find_Tow_Stop_Road(start,aa);
							for(m1=1;m1<=l;m1++)
							{
								line1[m1].Change_Amount=line[k-l+m1].Change_Amount;
								line1[m1].Stop_Amount=line[k-l+m1].Stop_Amount;
								strcpy(line1[m1].Stop_1,line[k-l+m1].Stop_1);
								strcpy(line1[m1].Stop_2,line[k-l+m1].Stop_2);
								strcpy(line1[m1].Way_1,line[k-l+m1].Way_1);
							}
							Find_Tow_Stop_Road(bb,end);
							for(m3=1;m3<=l;m3++)
							{
								line3[m3].Change_Amount=line[k-l+m3].Change_Amount;
								line3[m3].Stop_Amount=line[k-l+m3].Stop_Amount;
								strcpy(line3[m3].Stop_1,line[k-l+m3].Stop_1);
								strcpy(line3[m3].Stop_2,line[k-l+m3].Stop_2);
								strcpy(line3[m3].Way_1,line[k-l+m3].Way_1);
							}
							for(int t=1;t<m1;t++)	
								for(int y=1;y<m2;y++)
									for(int h=1;h<m3;h++)
								{
									line5[++o].Change_Amount=line1[t].Change_Amount+line2[y].Change_Amount+line3[h].Change_Amount;
									line5[o].Stop_Amount=line1[t].Stop_Amount+line2[y].Stop_Amount+line3[h].Stop_Amount;
									strcpy(line5[o].Stop_1,line1[t].Stop_1);
									strcpy(line5[o].Way_1,line1[t].Way_1);
									strcpy(line5[o].Stop_2,line1[t].Stop_2);									
									strcpy(line5[o].Way_2,line2[y].Way_1);
									strcpy(line5[o].Stop_3,line2[y].Stop_2);
									strcpy(line5[o].Way_3,line3[h].Way_1);
									strcpy(line5[o].Stop_4,line3[h].Stop_2);
								}
						}						
					}
				}
			}
		}
		ss1=line5[1].Stop_Amount*line5[1].Change_Amount;
		//ss2=line5[1].Change_Amount;
		for(int ii=2;ii<=o;ii++)
		{	
			if(line5[ii].Stop_Amount*line5[ii].Change_Amount<=ss1)
			{	
				ss1=line5[ii].Stop_Amount*line5[ii].Change_Amount;
				//ss1=line5[ii].Stop_Amount;	
				
			}
		}
	//	for(int jj=2;jj<=o;jj++)
	//	{
		//	if(line5[jj].Change_Amount<ss2)
	//			ss2=line5[jj].Change_Amount;		
	//	}
		int nn=0;
		for(q=1;q<=o;q++)
			if(line5[q].Stop_Amount*line5[q].Change_Amount<=ss1)
			printf("\n第%d条最佳路径:换乘2次,花费%d元,路程%d站\nS%s-%s-S%s-%s-S%s-%s-S%s\n",++nn,line5[q].Change_Amount,line5[q].Stop_Amount,line5[q].Stop_1,line5[q].Way_1,line5[q].Stop_2,line5[q].Way_2,line5[q].Stop_3,line5[q].Way_3,line5[q].Stop_4);
		//for(q=1;q<=o;q++)
		//	if(line5[q].Change_Amount<=ss2)
		//	printf("%d-%d_%s-%s-%s-%s-%s-%s-%s\n",line5[q].Change_Amount,line5[q].Stop_Amount,line5[q].Stop_1,line5[q].Way_1,line5[q].Stop_2,line5[q].Way_2,line5[q].Stop_3,line5[q].Way_3,line5[q].Stop_4);
			ss2=nn;
		}

	}

	if(ss2==0)
		printf("◆对不起!没有查到结果!两次换乘无法到达!\n");
	printf("按任意键结束!",ss2);
	getchar();
	getchar();
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -