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;
}

猜你喜欢

转载自blog.csdn.net/qq_43301061/article/details/84898754
今日推荐