火车车厢内座位的布局
1 5 9 73 77 2 6 10 74 78 过 道 3 7 11 75 79 4 8 12 76 80座位号从1到80;其中1.2.5.6位于一个间隔内,3.4.7.8也是一个间隔内的座位.售票规则总则,假设每次最多售4张;
售1张票;随机
售2张票:优先售货员张相邻的票,如果没有2张相邻的票就随机卖两张;所谓张相邻包括:1和2,3和4,5和6,7和8等等;
以下情况不算相邻:1和5,2和3等
售3张或4张:优先售一个间隔内的票如果不足,就提示,不售票如果不能满足优先原则,则售任何位置的票.
request.txt
2 4 1 2 3 1 4 1 4 3
1 3 2 3 3 1 2 1 1 4
程序如下:
#include "stdio.h"
#define A SeatState[i][j]=='T'//同一间隔内座位状态信息,T表示未售出
#define B SeatState[i+1][j]=='T'
#define C SeatState[i][j+1]=='T'
#define D SeatState[i+1][j+1]=='T'
int Seatmessage[4][20];//存放座位号的数组
char SeatState[4][20];//存放座位状态信息的数组
static int Count=0;//记录售出票数的静态常量
bool GetRequest(int *p)//将每次购票的要求从文件读入
{
static FILE* fp = fopen("d://request.txt","r");
static int nIndex = 0;
static int inputData[80] = {0};
static bool isfirst = true;
int i;
if(isfirst)
{
for(i = 0; i < 80; i++ )
{
if(fscanf(fp,"%d",&inputData[i]) == EOF)
break;
}
isfirst = false;
fclose(fp);
}
if(inputData[nIndex] == 0 || nIndex == 80) return false;
*p = inputData[nIndex++];
return true;
}
void OutputResult(int * SeatNum, int Count)//将每次售票结果输入到文件
{
FILE* fp = fopen("d://result.txt","a");
int i;
/* fprintf(fp,"==========================/n"); */
for(i = 0; i < Count; i++)
{
fprintf(fp,"%d,", SeatNum[i]);
}
fprintf(fp,"/n");
fclose(fp);
}
void sale1()//售出一张票的函数
{
int i=0,j=0,SeatNum[5];
for(i=0;i<4;i++)
{
for(j=0;j<20;j++)
{if(A)
break;
}
if(A)
break;
}
SeatNum[0]=Seatmessage[i][j];
SeatState[i][j]='F';
Count++;
OutputResult(SeatNum,1);
}
void sale2()//售出两张票的函数
{
int i=0,j=0,SeatNum[5];
for(i=0;i<3;i+=2)
{
for(j=0;j<20;j++)
{
if(A&&B)
break;
}
if(A&&B)
break;
}
/* printf("%d %d/n",i,j); */
if(A&&B)
{
SeatNum[0]=Seatmessage[i][j];
SeatNum[1]=Seatmessage[i+1][j];
SeatState[i][j]='F';
SeatState[i+1][j]='F';
Count+=2;
OutputResult(SeatNum,2);
}
else
{
for(int k=0;k<2;k++)
sale1();
}
}
void sale3()//售出三张票的函数
{
int i=0,j=0,SeatNum[5];
for(i=0;i<3;i+=2)
{
for(j=0;j<18;j+=2)
{
if(A&&B&&C)
{
break;
}
else if(A&&B&&D)
{
break;
}
else if(A&&C&&D)
{
break;
}
else if(B&&C&&D)
{
break;
}
}
if(A&&B&&C)break;
else if(A&&B&&D)break;
else if(A&&C&&D)break;
else if(B&&C&&D)break;
}
if(A&&B&&C)
{
SeatNum[0]=Seatmessage[i][j];
SeatNum[1]=Seatmessage[i+1][j];
SeatNum[2]=Seatmessage[i][j+1];
SeatState[i][j]='F';
SeatState[i+1][j]='F';
SeatState[i][j+1]='F';
Count+=3;
OutputResult(SeatNum,3);
}
else if((A&&B&&D))
{
SeatNum[0]=Seatmessage[i][j];
SeatNum[1]=Seatmessage[i+1][j];
SeatNum[2]=Seatmessage[i+1][j+1];
SeatState[i][j]='F';
SeatState[i+1][j]='F';
SeatState[i+1][j+1]='F';
Count+=3;
OutputResult(SeatNum,3);
}
else if(A&&C&&D)
{
SeatNum[0]=Seatmessage[i][j];
SeatNum[1]=Seatmessage[i][j+1];
SeatNum[2]=Seatmessage[i+1][j+1];
SeatState[i][j]='F';
SeatState[i][j+1]='F';
SeatState[i+1][j+1]='F';
Count+=3;
OutputResult(SeatNum,3);
}
else if(B&&C&&D)
{
SeatNum[0]=Seatmessage[i+1][j];
SeatNum[1]=Seatmessage[i][j+1];
SeatNum[2]=Seatmessage[i+1][j+1];
SeatState[i+1][j]='F';
SeatState[i][j+1]='F';
SeatState[i+1][j+1]='F';
Count+=3;
OutputResult(SeatNum,3);
}
else
{
for(int k=0;k<3;k++)
sale1();
}
}
void sale4()//售出四张票的函数
{
int i=0,j=0,SeatNum[5];
for(i=0;i<3;i+=2)
{
for(j=0;j<18;j+=2)
{
if(A&&B&&C&&D)
break;
}
if(A&&B&&C&&D)
break;
}
if(A&&B&&C&&D)
{
SeatNum[0]=Seatmessage[i][j];
SeatNum[1]=Seatmessage[i+1][j];
SeatNum[2]=Seatmessage[i][j+1];
SeatNum[3]=Seatmessage[i+1][j+1];
SeatState[i][j]='F';
SeatState[i+1][j]='F';
SeatState[i][j+1]='F';
SeatState[i+1][j+1]='F';
Count+=4;
OutputResult(SeatNum,4);
}
else
{
for(int k=0;k<4;k++)
sale1();
}
}
void main()
{
for(int i=0;i<4;i++)
for(int j=0;j<20;j++)
Seatmessage[i][j]=i+4*j+1;
/* for(i=0;i<4;i++)
{
for(int j=0;j<20;j++)
{
printf("%4d",Seatmessage[i][j]);
}
printf("/n");
} */
//用二维数组存储座位号信息
for(i=0;i<4;i++)
{
for(int j=0;j<20;j++)
{
SeatState[i][j]='T';
/* printf("%4c",SeatState[i][j]); */
}
/* printf("/n"); */
} //初始状态为T时说明票尚未卖出
int *p;
int S[2];
p=S;
while(GetRequest(S))
/* {printf("%d/n",*p);} */ //输出读入的需求
if(*p<=80-Count)
switch(*p)
{
case 1 : sale1();break;
case 2 : sale2();break;
case 3 : sale3();break;
case 4 : sale4();break;
default : printf("error/n");
}
else
if(*p>80-Count)
{
printf("票数不足,您最多还可以买到%d张票!!!/n",80-Count);
break;
}
/* for(i=0;i<4;i++) //屏幕显示坐位信息与状态
{
for(int j=0;j<20;j++)
{
printf("%4d",Seatmessage[i][j]);
}
printf("/n");
}
for(i=0;i<4;i++)
{
for(int j=0;j<20;j++)
{
printf("%4c",SeatState[i][j]);
}
}
*/
/* printf("%d/n",Count);*/ //统计售出的票数
}