/*
幼儿园两个班的小朋友排队时混在了一起
每个小朋友都知道自己跟前面一个小朋友是不是同班
请你帮忙把同班的小朋友找出来
小朋友的编号为整数
与前面一个小朋友同班用Y表示
不同班用N表示
输入描述:
输入为空格分开的小朋友编号和是否同班标志
比如 6/N 2/Y 3/N 4/Y
表示一共有4位小朋友
2和6是同班 3和2不同班 4和3同班
小朋友总数不超过999
0< 每个小朋友编号 <999
不考虑输入格式错误
输出两行
每一行记录一班小朋友的编号 编号用空格分开
并且
1. 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行
2. 如果只有一个班的小朋友 第二行为空
3. 如果输入不符合要求输出字符串ERROR
示例:
输入
1/N 2/Y 3/N 4/Y
输出
1 2
3 4
说明:2的同班标记为Y因此和1同班
3的同班标记位N因此和1,2不同班
4的同班标记位Y因此和3同班
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 1000
#define L 10000
typedef struct{
int idx;
char flag;
bool class;
}ChildInfo;
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
void myPrint(int *list, int len)
{
if(len == 0){
printf("\n");
return;
}
for(int m = 0; m < len; m++){
printf("%d",list[m]);
if( m < len -1){
printf(" ");
}else{
printf("\n");
}
}
}
void getChildClass(ChildInfo *child , int cnt)
{
int lenA = 0;
int lenB = 0;
int listA[N] = {0};
int listB[N] = {0};
child[0].class = false;
listA[0] = child[0].idx;
for (int i = 1; i < cnt; i++) {
if (child[i].flag == 'Y') {
child[i].class = child[i-1].class;
} else {
child[i].class = !child[i-1].class;
}
}
for (int j = 0; j < cnt; j++) {
if ( child[j].class == false){
listA[lenA++] = child[j].idx;
} else {
listB[lenB++] = child[j].idx;
}
}
qsort(listA, lenA, sizeof(int),cmp);
qsort(listB, lenB, sizeof(int),cmp);
myPrint(listA, lenA);
myPrint(listB, lenB);
return;
}
int main()
{
char list[N][5] = {{0}};
char *input = (char *)malloc(sizeof(char) * L);
memset(input, 0, sizeof(char) * L);
fgets(input,L,stdin);
char *p = NULL;
p = strtok(input, " /");
int cnt = 0;
while(p != NULL){
strcpy(list[cnt++], p);
p = strtok(NULL," /");
}
ChildInfo *child = (ChildInfo*)malloc(sizeof(ChildInfo)*cnt);
memset(child,0,sizeof(ChildInfo) * cnt);
int k = 0;
for(int i = 0; i < cnt; i = i + 2){
child[k].idx = atoi(list[i]);
if(child[k].idx < 0 || child[k].idx > 999){
printf("ERROR\n");
return -1;
}
child[k].flag = list[i+1][0];
//printf("%d %c\n",child[k].idx, child[k].flag);
k++;
}
getChildClass(child, k);
}