天天看點

Race sorting題解

題目描述

星際争霸(StarCraft)是暴雪公司制作發行的一款即時戰略遊戲。遊戲描述了26世紀初期,位于銀河系中心的三個種族在克普魯星際空間中争奪霸權的故事。三個種族分别是:人類(Terran),異蟲(Zerg),星靈(Protoss)。

現在tokitsukaze擁有n個機關,每個機關的編号是1-n,且沒有任何兩個機關編号相同。每個機關可能是人類,異蟲,星靈中的一種。

tokitsukaze定義了一種排序:種族排序(Race Sorting)。

規則是這樣的:規定三個種族的先後順序,race1,race2,race3,表示第一個種族的所有機關在第二個種族的所有機關和第三個種族的所有機關之前,第二個種族的所有機關在第三個種族的所有機關之前。但是注意:種族間的機關,他們的相對順序不發生改變。

也就是說,如果給出先後順序為Zerg,Terran,Protoss,那麼所有為Zerg的機關排在最前面,緊接着是所有Terran的機關,最後是所有Protoss的機關。如果其中一個種族沒有任何一個機關,則跳過該種族。

那麼對于tokitsukaze擁有的n個機關,做完給定先後順序的Race Sorting後,n個機關的順序是什麼?請按順序輸出每個機關的編号。

輸入描述:

第一行包含一個正整數T(T≤20),表示T組資料。

對于每一組資料:

第一行包含一個正整數n(1≤n≤1000),表示有n個機關。

接下來n行,每行輸入格式為:ID is race

其中,ID為一個正整數(1≤ID≤n),資料保證ID唯一。race為一個字元串,保證是"Terran",“Zerg”,"Protoss"三種中的一種(沒有引号)。

最後一行包含一個字元串,格式為:race1,race2,race3。表示3種種族的先後順序。

資料保證race1,race2,race3為"Terran",“Zerg”,"Protoss"的一種排列(沒有引号)。

詳情請見樣例。

輸出描述:

對于每組資料:

按race1,race2,race3的順序,在一行輸出排序後的ID序列,兩個ID用空格隔開,行末無多餘空格。

示例1

輸入

3

5

1 is Terran

2 is Zerg

3 is Zerg

4 is Protoss

5 is Terran

Zerg,Terran,Protoss

5

1 is Terran

3 is Zerg

2 is Zerg

4 is Protoss

5 is Terran

Zerg,Terran,Protoss

1

1 is Protoss

Zerg,Protoss,Terran

輸出

2 3 1 5 4

3 2 1 5 4

1

本題為一道簡單的模拟題,對于像我這樣的大一新生來說為簡單題,可以用結構體存ID和名字,然後根據所給順序輸出,沒有出現的名字就跳過。

代碼如下,如果有疑問,歡迎留言交流,一定及時回複。

#include <iostream>
#include <string.h>
using namespace std;
struct ss{
    int ad;
    char name[15];
}s[1005];

using namespace std;
int main() {
    int t,n,ad;
    char na[3][10],temp[30];
    cin>>t;
    while(t--){
        cin>>n;

        for(int i=1;i<=n;i++){
            scanf("%d is %s",&s[i].ad,s[i].name);
        }

        scanf("%s",temp);
        int i=0; ad=0;
        for(;i<strlen(temp);i++){
            if(temp[i]!=',') na[0][ad++]=temp[i];
            else {
                na[0][ad]='\0';   //坑點,如果後面的名字比前面的名字短的話,就會出問題了,自己體會。
                break;
            }
        }
        ad=0;
        for(i++;i<strlen(temp);i++){
            if(temp[i]!=',') na[1][ad++]=temp[i];
            else {
                na[1][ad]='\0';
                break;
            }
        }
        ad=0;
        for(i++;i<strlen(temp);i++){
            na[2][ad++]=temp[i];
            na[2][ad]='\0';

        }

        for(int i=1;i<=n;i++){
            if(strcmp(s[i].name,na[0])==0) {
                printf("%d ",s[i].ad);
            }
        }
        for(int i=1;i<=n;i++){
            if(strcmp(s[i].name,na[1])==0) {
                printf("%d ",s[i].ad);

            }
        }
        for(int i=1;i<=n;i++){
            if(strcmp(s[i].name,na[2])==0) {
                if(i==n) printf("%d",s[i].ad);
                else
                    printf("%d ",s[i].ad);
            }
        }
        cout<<endl;
    }
    return 0;
}