题目
代码
#include<stdio.h>
struct Doctor{
char d1;
char icon;
char d2;
int x;
};//定义结构体,d1表示第一个字符,icon表示符号,d2表示第二个字符,x表示相差的天数
int main()
{
int n;//n表示医生数量
scanf("%d",&n);
getchar();
struct Doctor doctor[n];
char flag[n];//flag字符数组用来存放医生的代号,其功能类似队列
char result[n];//result存放最终的结果
int position[n];//position数组与flag相对应,表示医生值班的天数
int i=0,j=0,k=0,temp,temp1;
//i表示队列的输入循环变量,j表示队列的输出循环变量,k表示doctor数组的循环变量,temp、temp1表示临时循环变量
char D1,Icon;//这两个变量为临时变量,用以在判断字符是否为=之前存放对应字符
int is=0,p;//is用于判断是否存在于flag数组的变量 ,p用于存放位置
for(temp=0;temp<n;temp++)
{
scanf("%c%c",&D1,&Icon);
if(Icon=='=')
{
scanf("%d",&p);
position[i]=p-1;
getchar();
flag[i]=D1;
result[position[i]]=D1;
i++;
}
else
{
scanf("%c%d",&doctor[k].d2,&doctor[k].x);
getchar();
doctor[k].d1=D1;
doctor[k].icon=Icon;
k++;
}
}
while(j!=i)
{
for(temp=0;temp<k;temp++)
{
if(doctor[temp].d1==flag[j])
{
for(temp1=0;temp1<i;temp1++)
if(doctor[temp].d2==flag[temp1]) break;//判断另一个字符是否在flag数组中,若不在,放进flag数组
if(temp1==i)
{
flag[i++]=doctor[temp].d2;
is=1;
}
if(doctor[temp].icon=='<')
{
result[position[j]-doctor[temp].x]=doctor[temp].d2;
if(is==1)
{
position[i-1]=position[j]-doctor[temp].x;is=0;
}
}
else
{
result[position[j]+doctor[temp].x]=doctor[temp].d2;
if(is==1)
{
position[i-1]=position[j]+doctor[temp].x;is=0;
}
}
}
else if(doctor[temp].d2==flag[j])
{
for(temp1=0;temp1<i;temp1++)
if(doctor[temp].d1==flag[temp1]) break;//判断另一个字符是否在flag数组中,若不在,放进flag数组
if(temp1==i)
{
flag[i++]=doctor[temp].d1;
is=1;
}
if(doctor[temp].icon=='<')
{
result[position[j]+doctor[temp].x]=doctor[temp].d1;
if(is==1)
{
position[i-1]=position[j]+doctor[temp].x;is=0;
}
}
else
{
result[position[j]-doctor[temp].x]=doctor[temp].d1;
if(is==1)
{
position[i-1]=position[j]-doctor[temp].x;is=0;
}
}
}
}
j++;
}
for(temp=0;temp<n;temp++)
printf("%c",result[temp]);
}
PTA测试点
总结
本题的主要思路就是设立三个数组flag,position以及result
flag是用来存放已知位置的字符,它的形式类似于队列
position与flag相对应,存放对应字符的位置
result则是最后用来输出的数组