题目的描述链接timus 1067
这个题目困扰了很久,后面理清思路了,解法也很明确,结果是超时!
在写代码时也收获了一些:
在把思路理好后去写代码会更顺利点,边想思路边写代码效率比较低!
先把代码放在这里,超时的代码不好说什么,以后还可以学到一些东西!第一次用new 和delete,比较怂!(2.046s>2.0s TLE)
#include<iostream>
#include<algorithm>
using namespace std;
struct Disk
{
int num; //该文件夹的编号 排序时候有用
int sonnum; //子节点的数目
int son[120]; //子节点对应的编号
char s[10]; //自身文件夹名
};
Disk d[20002],root[505];
int index[505],id; //最顶层对应的编号,最顶层编号数
int n,dnum; //文件路径数 文件夹个数
char s[100]; //文件路径
int search(char *q,int num)
{
int i;
if(num==-1)
{
for(i=0;i<id;i++)
{
if(strcmp(d[index[i]].s,q)==0)return index[i]; //返回最顶层文件夹的编号
}
return dnum;
}
else //在对应编号的文件夹中找是否有和自己文件夹名称相同的文件夹号
{
for(i=0;i<d[num].sonnum;i++)
{
if(strcmp(q,d[d[num].son[i]].s)==0)return d[num].son[i]; //返回子文件夹的编号
}
return dnum;
}
}
void input()
{
int i,j;
for(i=0;i<n;i++)
{
char tmp[100];
scanf("%s",s);
bool f=false; //判断每次首个文件夹时为false
int kt=0,rnum; //表示在第rnum文件夹的目录或子目录下
for(j=0;j<strlen(s);j++)
{
if(s[j]=='\\'&&f==false)
{
tmp[kt]='\0';
rnum=search(tmp,-1);
if(rnum==dnum) //最顶层文件夹没有一个匹配,就新加一个顶层文件夹
{
d[dnum].num=dnum;
strcpy(d[dnum].s,tmp);
d[dnum].sonnum=0; //子节点个数为初始化0
index[id++]=dnum;
dnum++;
}
kt=0;
f=true;
}
else if(s[j]=='\\')
{
tmp[kt]='\0';
int rtmp=search(tmp,rnum);
if(rtmp==dnum) //已有的子文件夹里没有找到该文件夹的名称,就新加一个文件夹
{
d[rnum].son[d[rnum].sonnum]=dnum;
strcpy(d[dnum].s,tmp);
d[dnum].num=dnum;
d[dnum].sonnum=0;
d[rnum].sonnum++;
dnum++;
}
rnum=rtmp;
kt=0;
}
else tmp[kt++]=s[j];
}
tmp[kt]='\0';
if(f==false)
{
rnum=search(tmp,-1);
if(rnum==dnum) //最顶层文件夹没有一个匹配,就新加一个顶层文件夹
{
d[dnum].num=dnum;
strcpy(d[dnum].s,tmp);
d[dnum].sonnum=0; //子节点个数为初始化0
index[id++]=dnum;
dnum++;
}
}
else
{
int rtmp=search(tmp,rnum);
if(rtmp==dnum) //已有的子文件夹里没有找到该文件夹的名称,就新加一个文件夹
{
d[rnum].son[d[rnum].sonnum]=dnum;
strcpy(d[dnum].s,tmp);
d[dnum].num=dnum;
d[dnum].sonnum=0;
d[rnum].sonnum++;
dnum++;
}
}
}
}
bool cmp(Disk aa,Disk bb) //定义排序规则 按字典序从小到大排序
{
return strcmp(aa.s,bb.s)<0;
}
void dfs(int nnum,int level) //从第一层子目录开搜,排序后输出
{
int i,j;
if(d[nnum].sonnum)
{
Disk *w=new Disk[505];
for(i=0;i<d[nnum].sonnum;i++)
{
w[i]=d[d[nnum].son[i]];
//printf("1: %s\n",w[i].s);
}
sort(w,w+d[nnum].sonnum,cmp);
for(i=0;i<d[nnum].sonnum;i++)
{
for(j=0;j<level;j++)printf(" ");
printf("%s\n",w[i].s);
//printf("%s\n",d[d[nnum].son[i]].s);
int x=w[i].num;
//dfs(d[nnum].son[i],level+1);
dfs(x,level+1);
}
delete [] w;
}
}
int main()
{
while(scanf("%d",&n)!=-1)
{
id=0;
dnum=0;
input();
int i,j;
for(i=0;i<id;i++)
root[i]=d[index[i]];
sort(root,root+id,cmp);
//sort(d,d+dnum,cmp);
for(i=0;i<id;i++)
{
int num=root[i].num;
printf("%s\n",root[i].s);
dfs(num,1);
}
}
return 0;
}原文:http://blog.csdn.net/quanqiuzhongzi/article/details/42208207