C++基础练习题之队列(不是queue,只是一道题,千万别误会)

队列

题目描述

又到午饭时间了。HF 中学的学生们又冲到食堂排队买饭。假设当前只有一个窗口在售
饭。于是饥肠辘辘的学生们排成了长长的一个队列。
突然,一卡通的打卡机坏了。学生们不得不散开队列,或坐或站地到别处休息。队列散
开前,每个学生记住了他前边和后边的学生的编号(编号是一个非负整数,并且各不相同) 。
经过紧急抢修,打卡机恢复正常,学生们排成一列继续买饭。为了公平,需要重新恢复
成队列原来的顺序。
食堂纪律监督员虽然是个学渣,但有幸恰好是你的好朋友。他把这个恢复队列的任务交
给了作为 HF 编程社社长的你。
对于队列第一个学生,它的前边没有人,故用 0 表示。
对于队列最后一个学生,它的后边没有人,故用 0 表示。

输入

第 1 行:1 个整数 N(2<=N<=500),表示队列中有多少个整数
接下来 N 行,每行 2 个整数 Ai,Bi(0<=Ai,Bi<=1000),其中 Ai 是排在这名学生前面学生的编
号,Bi 是排在这名学生后面学生的编号。

输出

第 1 行:输出 N 个整数,分别表示队列初始时从前往后排列的学生的编号。

样例输入

4
92 31
0 7
31 0
7 141

样例输出

92 7 31 141

提示

下图表示样例的初始队列

C++基础练习题之队列(不是queue,只是一道题,千万别误会)_第1张图片

运用数学思维计算。

代码如下:

#include
using namespace std;
int n,num[1000];
bool check1[2000],check2[2000];
struct node
{
    int last;
    int next;
}stu[1000];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>stu[i].last>>stu[i].next;
        if(stu[i].last==0) num[2]=stu[i].next;
        if(stu[i].next==0) num[n-1]=stu[i].last;
        check1[stu[i].last]=1;
        check2[stu[i].next]=1;
    }
    for(int i=1;i<=n;i++)
    {
        if(!check1[stu[i].next]&&stu[i].next) num[n]=stu[i].next;
        if(!check2[stu[i].last]&&stu[i].last) num[1]=stu[i].last;
    }
    int x=2,y=n-1;
    for(int i=0;in||y<0) break;
        for(int j=1;j<=n;j++)
        {
            if(x>n||y<0) break;
            if(stu[j].last==num[x]) num[x+=2]=stu[j].next;
            if(stu[j].next==num[y]) num[y-=2]=stu[j].last;
        }
    }
    x=1,y=n;
    for(int i=0;in||y<0) break;
        for(int j=1;j<=n;j++)
        {
            if(x>n||y<0) break;
            if(stu[j].last==num[x]) num[x+=2]=stu[j].next;
            if(stu[j].next==num[y]) num[y-=2]=stu[j].last;
        }
    }
    for(int i=1;i



你可能感兴趣的:(基础用法,错题大总结,C++,编程,基础,编程入门)