深入虎穴
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;
}
总结:整道题目有三个重点,一是存储结构的选择,不同的存储结构适应不同题目;二是树的实现,属于本章基本功;三是树的遍历,找到最大深度等和树有关的问题基本离不开遍历。
下阶段目标:好好复习,争取下次考试不要挂。
以上是关于深入虎穴的主要内容,如果未能解决你的问题,请参考以下文章