题目链接:https://cn.vjudge.net/contest/317394#problem/D
Sample Input
(11,LL) (7,LLL) (8,R)
(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
Sample Output
5 4 8 11 13 4 7 2 1
not complete
翻译:()内的表示节点的值和从根节点到此点的路径。(L向左,R向右)。一组数据以()结束。看能否构成一棵树。如果能就按照从左到右,层数递增的顺序输出节点,如果不能就输出 not complete。特殊的(5,):此点表示根节点。
分析:
1。如何能构成一棵树?
有根节点;每个位置就出现一次,(如果两个点的路径一样,那这个位置该放那个点?);如果这个点是子节点,那么它一定有父亲
2.如何记录不同路径出现的次数?
可以用map容器。来记录不同的路径出现的次数。
3.如何表示一个节点的各种信息?
开一个结构体
struct node{
int x,y;/*x为节点的值,y为路径的长度*/
string s;/*从根节点到每个节点的路径*/
} e[N];
依照层数等于路径数+1,来表示它在哪一层。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
#define N 300
struct node
{
int x,y;/*x为节点的值,y为路径的长度*/
string s;/*从根节点到每个节点的路径*/
} e[N];
int cmp(node t1,node t2) /*层数越大,级别越高,层数相同,从左到右级别递增*/
{
if(t1.y==t2.y)
return t1.s<t2.s;
return t1.y<t2.y;
}
int main()
{
int flag=0,k=0,len,sum,u;
string ch;
map<string,int>Q;/*记录不同的路径出现的次数*/
while(cin>>ch)
{
int num[N];
//k=0;/*记录有多少个节点*/
if(ch=="()") /*一组数据的结束条件*/
{
sort(e,e+k,cmp);
if(flag||e[0].y!=0)printf("not complete\n");
else
{
for(int i=0; i<k; i++)
{
if(e[i].y>0) /*有父亲*/
{
string s;
for(int j=0; j<e[i].s.size()-1; j++)
s+=e[i].s[j];/*父亲的路径*/
if(Q[s]!=1)/*父亲也只能是唯一的*/
{
flag=1;
break;
}
}
num[i]=e[i].x;
}
if(flag)
printf("not complete\n");
else
{
for(int i=0; i<k; i++)
{
if(i==0)printf("%d",num[i]);
else
printf(" %d",num[i]);
}
printf("\n");
}
}
k=0,flag=0;
Q.clear();
continue;
}
sum=0;
for(int i=1; i<ch.size(); i++) /*从第一个数字的位置开始*/
{
if(ch[i]==',')
{
u=i;
break;
}
sum=10*sum+ch[i]-'0';/*节点的值*/
}
e[k].x=sum;
sum=0;
e[k].s.clear();
for(int i=u+1; i<ch.size(); i++) /*遍历路径*/
{
if(ch[i]==')')break;
e[k].s+=ch[i];
sum++;
}
e[k].y=sum;
Q[e[k].s]++;
if(Q[e[k].s]>1)/*这个路径出现超过1次*/
flag=1;
k++;
}
return 0;
}