地铁换乘

来源:互联网 发布:桐乡淘宝摄影基地 编辑:程序博客网 时间:2024/04/18 09:55

//此题处理不是很好!有待改进!


#include <iostream>#include <string>#include <cmath>#include <algorithm>#include <limits>#include <cassert>using namespace std;string route_lineBT1 = "ABCDEz";//0-5 z-"T1"string route_lineBT2 = "ZKLMNO";//0-5 Z-"T2"//string route_circle1 = "T1A10A11A12A13T2A14A15A16A17A18A1A2A3A4A5A6A7A8A9";//string route_circle2 = "T1B6B7B8B9B10T2A14A15A16A17A18A1A2A3A4A5A6A7A8A9";//string route_circle3 = "T1A10A11A12A13T2B10B9B8B7B6";string route_circle1 = "zjklmZnopqrabcdefghi";//大环string route_circle2 = "zFGHIJZnopqrabcdefghi";//下小环string route_circle3 = "zjklmZJIHGF";//上环//进行转换方便字符串处理string str_A = "A1A2A3A4A5A6A7A8A9A10A11A12A13A14A15A16A17A18";string str_B = "B1B2B3B4B5B6B7B8B9B10B11B12B13B14B15";string str_a = "abcdefghijklmnopkr";string str_b = "ABCDEFGHIJKLMNO";//B1 - B5 T1 // 1//T2 B11 -B15 //7//other 3    //使俩者之后不大于第三者/* 此题代码未做过多放错处理,也没怎么优化。 字符间转换主要是之前未注意到除了有A1 还有像 A10这种,为了弥补错误,加上之前写了不少代码,就直接转化成ABCD此种区分。(迫不得已)  主要此题思路:  此题分为5种情况。  主要先拆出有:俩头俩段,加之中间3个圆。还有那个含最短路径的圆可以考虑接近重合可能,但此题特殊没必要考虑! 此题需注意的一点是,分段计算时,中间公共的点会重复计算。所以的去重!*/int translate(string str);int line_search(string source,string str1,string str2);int circle_search(string source,string str1,string str2);int min_circle_num(string str1,string str2);string map_str(string str_get1);void main_fcn();int main(){string str;do{main_fcn();cout<<"y?n :";cin>>str;cout<<str<<endl;}while(str != "n");return 1;}void main_fcn(){int num1,num2;int res(0);string str_get1,str_get2;string str_first,str_second;cin>>str_get1>>str_get2;str_first =map_str(str_get1);str_second = map_str(str_get2);assert(!str_first.empty());//若转化出错即报错!assert(!str_second.empty());num1 = translate(str_first);num2 = translate(str_second);if(num1 > num2)//交换,有序{string temp;temp = str_first;str_first = str_second;str_second = temp;} switch (num1+num2){case 2: //1 1res = line_search(route_lineBT1,str_first,str_second);break;case 4: //1 3res += line_search(route_lineBT1,str_first,string("z"));res += min_circle_num(str_second,"z")-1;//主要t1算俩次break;case 8: //1 7   res += line_search(route_lineBT1,str_first,string("z")) -1;//主要t1,t2算俩次res += min_circle_num("z","Z");res += line_search(route_lineBT2,"Z",str_second)-1;break;case 6: //3 3res = min_circle_num(str_first,str_second);break;case 10://3 7 res += min_circle_num("Z",str_first);res += line_search(route_lineBT2,"Z",str_second)-1;//主要t1算俩次break;case 14: //7 7    res = line_search(route_lineBT2,str_first,str_second);break;default:res = 0;}cout <<"res:"<<res<<endl;}string map_str(string str_get1)//将A10 B14 映射为ABCD等{string str_first("");int pos ;if(str_get1 == "T1") return "z";if(str_get1 == "T2") return "Z";if((pos = str_A.find(str_get1)) != -1){if(pos == 0)str_first =str_a[0];else if(pos <= 16&&pos>0)str_first = str_a[pos/2];elsestr_first = str_a[9+(pos-18)/3];return str_first;}if((pos = str_B.find(str_get1)) != -1){if(pos == 0)str_first =str_b[0];else if(pos <= 16&&pos>0)str_first = str_b[pos/2];elsestr_first = str_b[9+(pos-18)/3];return str_first;}return str_first;}int translate(string str)//计算是属于哪个段{//转换看是哪个区间if (route_lineBT1.find(str) != -1) return1;if(route_lineBT2.find(str) != -1)return7;return 3;}int line_search(string source,string str1,string str2)//线性间距离{return (abs(source.find(str1) - source.find(str2)))+1;}int circle_search(string source,string str1,string str2)//环状距离{int num ,len;int pos1,pos2;len = source.length();if((pos1 = source.find(str1)) == -1)return INT_MAX;if((pos2 = source.find(str2)) == -1 )return INT_MAX;num = abs(pos1-pos2)+1;//线性长度return num < (len-num+2) ? num:(len-num+2);//自己实现最小化}int min_circle_num(string str1,string str2)//取最小的{int min_val[3];min_val[0] = circle_search(route_circle1,str1,str2);min_val[1] = circle_search(route_circle2,str1,str2);min_val[2] = circle_search(route_circle3,str1,str2); for(int i = 1;i < 3;i++){min_val[0] = min_val[0] < min_val[i]?min_val[0]:min_val[i];}return min_val[0];}



很似纠结,提交了4次,结果abs,   不管是用

//#include <cmath> //竟然用不了abs
//#include <stdlib.h>

都不行,无赖之下重写了一个。!!!!!!

unsigned int abs_my(int num){return num > 0 ? num: - num;}


不容易啊!!


0 0
原创粉丝点击