深入虎穴

Posted fengyaonie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入虎穴相关的知识,希望对你有一定的参考价值。

1.一看到这道题,就知道要用树的结构,而且我们这章学的也是树。

2.根据题目的样例试图画出树的形状

技术图片

 

3.下一步确定树的存储结构,我们可以用邻接矩阵和结构体数组来存储;其中邻接矩阵可以很好的遍历每个门,但在这道题目中每扇门后通往的门的数量可能并不多,导致实际上出现的可能是稀疏矩阵,需要浪费大量空间。所以我们还是采用结构体数组来存储。

4.接下来就是代码实现

  ①结构定义并创建实例

typedef struct{
    int doors;//门的数量
    int *p;//p指向具体门的编号;把P看作一个整形数组
}node;
int main()
{
    //变量的定义
    node *a;//定义一个动态的整形数组
    int i,j,k,root;
    
    root=input(a);
    cout<<find(a,root)<<endl;
    
    return 0;
}
  ②数据读入
int input(node *&a)
{
    int i,j,n,x;
    bool *vi;
    cin>>n;
    a=new node[n+1];//为A数组申请空间
    vi=new bool[n+1];
    for(i=1;i<=n;i++)//将vi数组初始化为fales
        vi[i]=false;
        
    for(i=1;i<=n;++i){
        cin>>x;
        a[i].doors=x;
        a[i].p=new int[x];
        for(j=0;j<x;++j){
            cin>>a[i].p[j];
            vi[a[i].p[j]]=true;
        }
    }
    
    //找出根在数组的下标
    for(i=1;i<=n;++i)
        if(!vi[i]) break;
    
    return i;
}
  ③遍历
int find(node *a,int root)
{//从a数组的root下标开始往下搜索
    queue<int> q;//定义用于存放待访问的 门编号的队列
    //根编号入队
    q.push(root);
    int x,i;
    
    //当队列不为空;
    //x=出队
    //x后面的门号入队
    while(!q.empty()){
        x=q.front();
        q.pop();
        for(i=0;i<a[x].doors;++i)
            q.push(a[x].p[i]);
    }
    //答案就是x
    return x;
}
 总结:整道题目有三个重点,一是存储结构的选择,不同的存储结构适应不同题目;二是树的实现,属于本章基本功;三是树的遍历,找到最大深度等和树有关的问题基本离不开遍历。
 
下阶段目标:好好复习,争取下次考试不要挂。

以上是关于深入虎穴的主要内容,如果未能解决你的问题,请参考以下文章

深入理解spring

深入理解计算机系统的目录1

深入了解Java的String

深入理解Tomcat

深入了解ASP.NET运行内幕

深入理解Eureka覆盖状态(九)