}
高级题:地铁换乘
注意:1、要注意地铁线A是环线,B是直线,且都为双向的;最好在纸上画一下,按不同的出发地与目的地分类讨论;
2、要求的是最少的车站数量,需要考虑两点之间的最短路径问题。
#include
using namespace std;
int input_check(char start[],char destin[])
{int i,find_start=0,find_destin=0;
char
A[20][5]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1","A10","A11","A1 2","A13","T2","A14","A15","A16","A17","A18"};
char
B[17][5]={"B1","B2","B3","B4","B5","T1","B6","B7","B8","B9","B10","T2","B11", "B12","B13","B14","B15"};
for(i=0;i<20;i++)
{if(strcmp(start,A[i])==0)
find_start=1;
if(strcmp(destin,A[i])==0)
find_destin=1;
}
for(i=0;i<17;i++)
{if(strcmp(start,B[i])==0)
find_start=1;
if(strcmp(destin,B[i])==0)
find_destin=1;
}
if(find_start&&find_destin&&(strcmp(start,destin)!=0))
return 1;
else
return 0;
}
int station_count(char start[],char destin[])
{int i,start_index=0,destin_index=0,count;
char start_type,destin_type,*temp=new char[5];
if((start[0]>destin[0])||((start[0]==destin[0])&&(strlen(start)>strlen(destin)))||((start[0] ==destin[0])&&(strlen(start)==strlen(destin))&&(strcmp(start,destin)>0))) {strcpy(temp,start);
strcpy(start,destin);
strcpy(destin,temp);}
start_type=start[0];destin_type=destin[0];
for(i=1;start[i]!='\0';i++)
start_index=10*start_index+(start[i]-'0');
for(i=1;destin[i]!='\0';i++)
destin_index=10*destin_index+(destin[i]-'0');
if(start_type=='T'&&destin_type=='T')
return 6;
if(destin_type=='T')
{if(destin_index==1)
{if(start_type=='A')
{if(start_index>=1&&start_index<=9)
count=11-start_index;
else if(start_index>=10&&start_index<=13)
count=start_index-8;
else if(start_index>=14&&start_index<=18)
count=start_index-7;}
else if(start_type=='B')
{if(start_index>=1&&start_index<=5)
count=7-start_index;
else if(start_index>=6&&start_index<=15)
count=start_index-4;}
}
else if(destin_index==2)
{if(start_type=='A')
{if(start_index>=1&&start_index<=9)
count=(start_index+6<16-start_index)?(start_index+6):(16-start_index);
else if(start_index>=10&&start_index<=13)
count=15-start_index;
else if(start_index>=14&&start_index<=18)
count=start_index-12;}
else if(start_type=='B')
{if(start_index>=1&&start_index<=10)
count=12-start_index;
else if(start_index>=11&&start_index<=15)
count=start_index-9;}
}
}
if(start_type=='A'&&destin_type=='A')
{if((start_index>=1&&start_index<=9)&&(destin_index>=1&&destin_index<=9)||(st art_index>=10&&start_index<=13)&&(destin_index>=10&&destin_index<=13)||(sta
rt_index>=14&&start_index<=18)&&(destin_index>=14&&destin_index<=18)) count=destin_index-start_index+1;
if((start_index>=1&&start_index<=9)&&(destin_index>=10&&destin_index<=13)) count=(destin_index-start_index+2<20-(destin_index-start_index))?(destin_index-star t_index+2):(20-(destin_index-start_index));
if((start_index>=1&&start_index<=9)&&(destin_index>=14&&destin_index<=18)) count=(destin_index-start_index+3<19-(destin_index-start_index))?(destin_index-star t_index+3):(19-(destin_index-start_index));
if((start_index>=10&&start_index<=13)&&(destin_index>=14&&destin_index<=18) )
count=destin_index-start_index+2;
}
if(start_type=='B'&&destin_type=='B')
{if((start_index>=1&&start_index<=5)&&(destin_index>=1&&destin_index<=5)||(st art_index>=6&&start_index<=10)&&(destin_index>=6&&destin_index<=10)||(start_ index>=11&&start_index<=15)&&(destin_index>=11&&destin_index<=15)) count=destin_index-start_index+1;
if((start_index>=1&&start_index<=5)&&(destin_index>=6&&destin_index<=15)||(st art_index>=6&&start_index<=10)&&(destin_index>=11&&destin_index<=15)) count=destin_index-start_index+2;
}
if(start_type=='A'&&destin_type=='B')
{if(start_index>=1&&start_index<=9)
{if(destin_index>=1&&destin_index<=5)
count=17-start_index-destin_index;
if(destin_index>=6&&destin_index<=10)
count=(destin_index-start_index+6<17-(destin_index-start_index))?(destin_index-star t_index+6):(17-(destin_index-start_index));
if(destin_index>=11&&destin_index<=15)
count=(destin_index-start_index+6index+6):(start_index+destin_index-4);
}
if(start_index>=10&&start_index<=13)
{if(destin_index>=1&&destin_index<=5)
count=start_index-destin_index-2;
if(destin_index>=6&&destin_index<=10)
count=(start_index+destin_index-13<26-start_index-destin_index)?(start_index+desti n_index-13):(26-start_index-destin_index);
if(destin_index>=11&&destin_index<=15)
count=destin_index-start_index+5;
}
if(start_index>=14&&start_index<=18)
{if(destin_index>=1&&destin_index<=10)
count=start_index-destin_index-1;
if(destin_index>=11&&destin_index<=15)
count=start_index+destin_index-22;
}
}
return count;
}
void main()
{int count,flag;
char start[5],destin[5];
cin>>start>>destin;
flag=input_check(start,destin);
if(flag)
{count=station_count(start,destin);
cout<}
以下则是我机试时的考题:
考试时间:2013年9月12日下午2:00-4;00(两个小时)
考试地点:南京华为研究所N5三楼培训大厅(南京软件大道101号) 上机环境:C/C++: VS2005(或VC6.0) Java:JDK1.7
试题类型:上机编程
(自己写的程序,水平很烂,各位看官见笑了):
1、删除一个字符串首尾的下划线。
例如,输入:hello_
输出:hello
注意:1、删除的是首尾的下划线,中间如果有的话则保留;
2、要考虑一个字符串全是下划线的情况。
#include
using namespace std;
void underline_delete(char *str,int len)
{int i,j,k;
if(str==NULL)
return;
if(len<1)
return;
for(i=0;str[i]=='_';i++);
for(j=len-1;str[j]=='_';j--);
if(i>j)
{strcpy(str,"");
return;}
else
{char *Str=new char [len+1];
int Len=0;
for(k=i;k<=j;k++)
Str[Len++]=str[k];
Str[Len]='\0';
strcpy(str,Str);
delete [] Str;
}
}
void main()
{char str[100];
int len;
gets(str); //hello_//_Hello_HuaWei_//_This_is_a_C++_program._
len=strlen(str);
underline_delete(str,len);
cout<//cout<}
2、剔除一个字符中重复的字符,然后按ASCII码值从小到大排列。
例如,输入:abbcccddeeeffgghh
输出:abcdefgh
注意:1、剔除是整个字符串中重复的字符,而不是连续的字符
2、要考虑空格(space)的情况(考试时忘了考虑这个,当时心情有点小紧
张,一时疏忽了,因此这道题只得了一半分)。
程序代码如下:
#include
using namespace std;
void sort(char *str,int len)
{int i,j,k;
char ch;
if(str==NULL||len<2)
return;
for(i=0;i{k=i;
for(j=i+1;jif(str[j]k=j;
if(k!=i)
{ch=str[k];str[k]=str[i];str[i]=ch;}
}
}
void redundance_delete(char *str,int len)
{int i,diff_count=0;
char ch;
if(str==NULL)
return
if(len<1)
return;
sort(str,len);//先排序,再剔除字符串中重复的字符,否则剔除的是连续出现的字符
char *Str=new char[len+1];
diff_count++;ch=str[0];
Str[diff_count-1]=ch;
for(i=1;i{if(i==len-1 && ch!=str[i])
{diff_count++;ch=str[i];
Str[diff_count-1]=ch;}
while(ii++;
if(i>=len)
break;
diff_count++;ch=str[i];
Str[diff_count-1]=ch;
}
Str[diff_count]='\0';
strcpy(str,Str);
delete [] Str;
}
void main()
{char str[100];
int len=0;
//用cin函数输入的话,编译系统会将空格' '当作结束符'\0'来处理
gets(str);//abbcccddeeeffgghh//ab ba cd dc//dcbaabcd//abcd efgh_
len=strlen(str);
redundance_delete(str,len);
cout<}
3、渡口问题(原题我记不得了,大概如下):一个渡口有N辆客车和货车需要乘船,规定如下:
同类车辆先来的先上;客车优先于货车;客车上了4辆后货车才可以上;客车若不足4辆则货车可以补充;若无货车则客车可以全上。其中客车的优先级为0,货车的优先级为1。
例如,输入:5
0 0 1 0 1
输出:0 1 3 2 4
注意:1、输出的是原车辆在序列中的序号,且从0算起,因而前后交换时要保
持相对顺序不变;
2、要考虑客车不足4辆,或者货车数量和客车数量有一者或两者为0的
情况。
#include
using namespace std;
void shift(int len,int a[],int pos)
{if(len<1)
return;
if(pos<0)
return;
int i,s;
s=a[pos+len];
for(i=len;i>0;i--)
a[pos+i]=a[pos+i-1];
a[pos]=s;
}
void ferry(int num, int input[],int output[])
{int i,truck_num=0,bus_num=0;
if(num<1)
return;
for(i=0;i{if(input[i]==0)
bus_num++;
else if(input[i]==1)
truck_num++;
else
{output[0]=-1;
return;}
output[i]=i;}
if(truck_num==0||bus_num==0)
return;
int truck_count=0,bus_count=0,len,pos=0;
for(i=0;truck_count+bus_countif(input[pos]!=0)
{for(i=pos,len=0;input[i];i++,len++);
shift(len,input,pos);
shift(len,output,pos);}
pos=truck_count+(++bus_count);}
while(bus_count{if(input[pos]!=0)
{for(i=pos,len=0;input[i];i++,len++);
shift(len,input,pos);
shift(len,output,pos);}
pos=truck_count+(++bus_count);}
if(bus_count>=bus_num)
return;
if(truck_count>=truck_num)
return;
if(input[pos]!=1)
{for(i=pos,len=0;!input[i];i++,len++);
shift(len,input,pos);
shift(len,output,pos);}
pos=(++truck_count)+bus_count;}
}
void main()
{int i,N;
cin>>N;//5//9//6//3//4//8
int *input=new int [N],*output=new int [N];
for(i=0;icin>>input[i];//0 0 1 0 1//1 1 0 1 0 0 1 1 0//1 1 0 0 1 0//1 1 0//0 0 0 0//1 1 0 0 1 0 0 1 ferry(N,input,output);
if(output[0]!=-1)
{for(i=0;icout<