题意: 爱丽丝能够控制木偶, 并且还能通过木偶控制其它木偶。如果木偶直接由爱丽丝控制, 则它的level = 1, 如果木偶是由爱丽丝直接控制的木偶所控制的 则它的level =2, 以此类推。 输入的一行 前一个名字表示被控制的木偶, 后一个名字表示控制者。 控制者一定会在被控制者之前出现。 输出所有的木偶 以及木偶的level, 按level从小到大排序, 若level一样, 则按字典序排序。
思路:既然控制者一定会先出现, 那么我们只用一个一位数组father[] 来保存所有木偶 father[0] 为爱丽丝, 当第i个木偶出现的时候,从1到i-1扫描数组的木偶, 找到它的控制者的level, 然后它的level就在此基础上+1, 最后把这个木偶存在father[i]。
算法复杂度:总共要扫描 1 + 2 +3......+ (n-1) + n. 即n(n + 1)/ 2. 故复杂度为 o(n^2)
代码:
今天在比赛的时候自己写sort()的辅助函数。 感觉突然很简洁的实现了 当level一样时, 按字典序排。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_LEN 25
#define MAX_N 1010
struct SPuppet
{
char name[MAX_LEN];
int level;
};
int getFatherLvl(char *);
int cmp(const SPuppet &, const SPuppet &);
int n;
SPuppet father[MAX_N];
int main()
{
while (scanf("%d", &n) == 1) {
// init
memset(father, 0, sizeof(father));
strcpy(father[0].name, "Alice");
father[0].level = 0;
// enter
char pupName[MAX_LEN], fatherName[MAX_LEN];
for (int i = 1; i <= n; i++) {
scanf("%s %s", pupName, fatherName);
father[i].level = getFatherLvl(fatherName) + 1;
strcpy(father[i].name, pupName);
}
// sort
sort(father + 1, father + 1 + n, cmp);
// output
for (int i = 1; i <= n; i++) {
printf("%s %d\n", father[i].name, father[i].level);
}
// end a case
}
return 0;
}
int getFatherLvl(char *name)
{
for (int i = 0; i < n; i++) {
if (strcmp(father[i].name, name) == 0) {
return father[i].level;
}
}
}
int cmp(const SPuppet &a, const SPuppet &b)
{
if (a.level != b.level) {
return a.level < b.level;
} else {
int rslt = strcmp(a.name, b.name);
if (rslt < 0) {
return true;
} else {
return false;
}
}
}