#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct train {
int * aStationIds;//动态建立途径站数组
int * bol;//动态建立可用区间表
}*piao;//动态建立票仓表
int i,j;//循环变量
int n,m;//车票数量,途径站数量
void SetOneTrainLine(unsigned int StationNum ,const unsigned int* pStationIds ,unsigned int SeatCount) {//建立票数据函数
piao=(struct train *)malloc(sizeof(struct train)*SeatCount);//建立票结构体
n=SeatCount,m=StationNum;//记录车票数量,途径站数量
for(i=0; i<SeatCount; i++) {//为每个车票设置属性
piao[i].aStationIds=(int *)malloc(sizeof(int)*StationNum);//为第i张车票开拓途径站数组空间
for(j=0; j<StationNum; j++)
{//循环赋值途径站
piao[i].aStationIds[j]=pStationIds[j];
}
piao[i].bol= (int *)malloc(sizeof(int)*StationNum);//为第i张车票开拓可用区间数组空间
for(j=0; j<StationNum; j++)
{//循环初始化赋值
piao[i].bol[j]=1;
}
}
}
int SeaTicket(unsigned int SrcStationId,unsigned int DestStationId) {//购票函数
int x,y;//记录起点和终点的位置
for(j=0; j<m; j++) {//循环查询起点位置
if(piao->aStationIds[j]==SrcStationId)x=j;
}
for(j=0; j<m; j++) {//循环查询终点位置
if(piao->aStationIds[j]==DestStationId)y=j;
}
for(i=0; i<n; i++) { //从头检测每张车票
int k=1;//假定该车票能满足条件
for(j=x; j<y; j++)
{ //循环证明此张车票满足要求
if(piao[i].bol[j]==0)k=0;//如果发现不满足则改变k值
}
if(k==1) { //如果k值没有被改变证明此票可以满足条件
for(j=x; j<y; j++)
{ //循环取走此段区间
piao[i].bol[j]=0;
}
return 0;//返回结果
}
}
return -1;//所有车票都无法满足条件则返回错误
}
unsigned int FindLeftTickets(unsigned int SrcstationId,unsigned int DestStationId) {
int ans=0,x,y;//记录满足条件的车票数量以及起点和终点的位置
for(j=0; j<m; j++)
{ //循环查询起点位置
if(piao->aStationIds[j]==SrcstationId)x=j;
}
for(j=0; j<m; j++)
{ //循环查询终点位置
if(piao->aStationIds[j]==DestStationId)y=j;
}
if(y<=x)return -1;
for(i=0; i<n; i++)
{ //从头检测每张车票
int k=1;//假定该车票能满足条件
for(j=x; j<y; j++)
{ //循环证明此张车票满足要求
if(piao[i].bol[j]==0)k=0;//如果发现不满足则改变k值
}
if(k==1) { //如果k值没有被改变证明此票可以满足条件
ans++;//满足条件的车票数加一
}
}
return ans;//返回满足条件的车票数
}
void TextCase01(void) {
unsigned int aStationIds[10]= {1,2,3,4,5,6,7,8,9,10};
SetOneTrainLine(sizeof(aStationIds)/sizeof(aStationIds[0]),aStationIds,10);
if(10==FindLeftTickets(1,10)) puts("检测点1通过");
if(0==SeaTicket(1,3)) puts("检测点2通过");
if(0==SeaTicket(2,4)) puts("检测点3通过");
if(0==SeaTicket(3,5)) puts("检测点4通过");
if(0==SeaTicket(4,6)) puts("检测点5通过");
if(0==SeaTicket(5,7)) puts("检测点6通过");
if(0==SeaTicket(6,8)) puts("检测点7通过");
if(9==FindLeftTickets(1,2)) puts("检测点8通过");
if(8==FindLeftTickets(2,4)) puts("检测点9通过");
if(-1==FindLeftTickets(4,3)) puts("检测点a通过");
if(8==FindLeftTickets(3,5)) puts("检测点b通过");
if(8==FindLeftTickets(4,5)) puts("检测点c通过");
if(8==FindLeftTickets(1,10)) puts("检测点d通过");
}
int main() {
TextCase01();
}