机试真题 关于排座位的问题
问题:座位排序,对于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; } }

浙公网安备 33010602011771号