1. 程式人生 > >C++基礎練習題之佇列(不是queue,只是一道題,千萬別誤會)

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

提示

下圖表示樣例的初始佇列


運用數學思維計算。

程式碼如下:

#include<iostream>
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;i<n-2;i++)
    {
        if(x>n||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;i<n-2;i++)
    {
        if(x>n||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<n;i++)
        cout<<num[i]<<" ";
    cout<<num[n];
}