本题主要是进行一个结构的化简(利用mark标记数组查询存在)和递归树的查找、删除,很有借鉴意义
同时,对文件系统的代码进行改编,查询目录以及所有子目录
AC代码
#include <bits/stdc++.h>
using namespace std;
int mark[105];
vector<int>graph[105];
void del(int x)//简单的DFS
{
mark[x]=0;
for(int i=0;i<graph[x].size();i++)
{
int u=graph[x][i];
del(u);
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(graph,0,sizeof(graph));
memset(mark,0,sizeof(mark));
int n;
scanf("%d",&n);
mark[0]=1;
for(int i=0;i<n;i++)
{
char buf[60];
scanf("%s",buf);
if(strcmp(buf,"FORK")==0)
{
int a,b;
scanf("%d%d",&a,&b);
graph[a].push_back(b);
mark[b]=1;
}
if(strcmp(buf,"QUERY")==0)
{
int a;
scanf("%d",&a);
if(mark[a]==1) printf("Yes\n");
else printf("No\n");
}
if(strcmp(buf,"KILL")==0)
{
int x;
scanf("%d",&x);
mark[x]=0;
del(x);
}
}
}
return 0;
}
下面仿照这个思路对文件系统那题进行改编
#include <bits/stdc++.h>
using namespace std;
map<string,vector<string> >File;
map<string,vector<string> >Dir;
void DFS(string str)
{
for(int i=0;i<Dir[str].size();i++)
{
printf("%s\n",Dir[str][i].c_str());
}
for(int i=0;i<Dir[str].size();i++)
{
DFS(Dir[str][i]);
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
File.clear();//果然不能重复定义的!还是clear()!
Dir.clear();
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
char buf[60];
scanf("%s",buf);
if(strcmp(buf,"CREATEFILE")==0)
{
char buf0[60];
char buf1[60];
scanf("%s",buf0);
scanf("%s",buf1);
string str0;
string str1;
str0=buf0;
str1=buf1;
File[str1].push_back(str0);
}
if(strcmp(buf,"CREATEDIR")==0)
{
char buf0[60];
char buf1[60];
scanf("%s",buf0);
scanf("%s",buf1);
string str0;
string str1;
str0=buf0;
str1=buf1;
Dir[str1].push_back(str0);
}
if(strcmp(buf,"LISTFILE")==0)
{
char buf0[60];
scanf("%s",buf0);
string str0;
str0=buf0;
for(int i=0;i<File[str0].size();i++)
{
printf("%s\n",File[str0][i].c_str());
}
}
if(strcmp(buf,"LISTDIR")==0)
{
char buf0[60];
scanf("%s",buf0);
string str0;
str0=buf0;
DFS(str0);//经过更改,可以求出改目录下所有目录,以及他们的所有子目录
}
}
}
return 0;
}
通过递归查询,就可以搜索所有子目录了,文件也是能够查询的