机试真题 关于排座位的问题

问题:座位排序,对于7个人A,B,、、、G,输入7行,每一行比如 A B 6,G C -2这种表示A在B前面6排,G在C前面-2排(在C后面2排),求出这7个人从前到后顺序,最前面的是第一排,输出结果

目前没看出这个要用什么数据结构在做,个人觉得直接设定一个基准坐标,循环计算各个点的数轴位置即可;

由于有可能两点的坐标都不存在,所以这个时候使用队列,循环处理,直到所有点全部计算坐标完毕;

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;

struct point {
    int a;
    int b;
    int c;
};

struct node {
    int index = 0;
    int dis = -1;
};
node dis[7];
bool flag[7][7] = { false };
queue<point>que;
void init() {
    for (int i = 0; i < 7; i++) {
        dis[i].index = i;
    }
    dis[0].dis = 0;
}

bool cmp(node a, node b) {
    return a.dis < b.dis;
}

int main() {
    char a, b;
    int c;
    init();
    for (int i = 0; i < 7; i++) {
        cin >> a >> b >> c;
        int ia = a - 'a';
        int ib = b - 'a';
        if (flag[ia][ib])
            continue;
        flag[ia][ib] = flag[ib][ia] = true;
        if (c < 0) {
            int temp = ia;
            ia = ib;
            ib = temp;
            c = -c;
        }
        if (dis[ia].dis != -1) {
            //当若a点有参照值;
            dis[ib].dis = dis[ia].dis + c;
        }
        else if (dis[ib].dis != -1) {
            //倘若b点有参照值;
            dis[ia].dis = dis[ib].dis - c;
        }
        else {
            point p;
            p.a = ia;
            p.b = ib;
            p.c = c;
            que.push(p);
        }
    }
    while (!que.empty()) {
        point p = que.front();
        que.pop();
        int ia = p.a;
        int ib = p.b;
        int c = p.c;
        if (dis[ia].dis != -1) {
            //当若a点有参照值;
            dis[ib].dis = dis[ia].dis + c;
        }
        else if (dis[ib].dis != -1) {
            //倘若b点有参照值;
            dis[ia].dis = dis[ib].dis - c;
        }
        else {
            que.push(p);
        }
    }
    sort(dis, dis + 7, cmp);
    for (int i = 0; i < 7; i++) {
        cout << char('a' + dis[i].index) << endl;
    }
}

猜你喜欢

转载自www.cnblogs.com/songlinxuan/p/12672693.html