描述:
阿伟在网吧玩一款叫做“逃离地下室”的密码游戏,游戏规则是这样的:
地下室有多层,编号为0,1,2,…,n(n<100)的房间分布在其中,所有房间都有1个下来的入口,最多有左右2个通往下一层房间的出口。
第一层只有一个房间,是阿伟的出发点,角色下来时的入口被电子密码锁锁住了。
游戏说明,往右边走将来会遇到的所有房间,都是往左走遇不到的,反过来也一样,在房间里的路径不会形成环。
阿伟离开地下室的密码,是所有没出口的房间编号的一个特殊排序,排序规则为:先输出距离地面近的房间号,距离相同时,先输出靠左侧的房间号。
密码正确阿伟就会回家,如果一直解不开,阿伟可能会因为没有网费,去陌生人杰哥的家里继续玩游戏。你是阿伟的好朋友阿斌,你不能很逊地看着朋友去陌生人家里,你决定写个代码帮他打开密码锁……
输入:
第一行,为一个非负整数n,0≤n<100;
之后n+1行,代表从编号0开始的房间,对应的左右出口通往的房间号,若该方向无出口,则用 “*” 表示。
输出:
先输出距离地面近的房间号,距离相同时,先输出靠左侧的房间号。
密码不含任何空格!如房间为:5号 2号 0号,则“520”为密码。
样例输入
5 | |
* | * |
5 | * |
* | * |
1 | 4 |
2 |
* | * |
样例输出 | |
520 | |
样例分析 | |
思路:根据题目描述及样例可以看出这是一个二叉树的广度优先搜索的题,我们选择用静态链表建立二叉树并用队列实现广度优先搜索;
代码
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const ll maxx = 1e18; const int N = 1e6+10; const int p = 1e4; const double eps = 1e-8; //二叉树的层序遍历 //二叉树的建立 int n,root1; string a;//用字符串处理 "*" 和 "100" 不同的情况 bool flag[1002]; //用来找树根 int con(string s) { int sum=0,len=s.size(); for(int i=0;i<len;i++) { sum=sum*10+s[i]-'0'; } return sum; }//读入数字 struct Tree1{ int Lchild1;//左孩子 int Rchild1;//右孩子 int num; }tree1[1002],le; queue<Tree1>qu;//队列存结构体 int main() { scanf("%d",&n); for(int i=0;i<=n;i++)//注意循环次数 { cin>>a; if(a=="*") tree1[i].Lchild1=-1;//用 -1 代表没有子节点 else tree1[i].Lchild1=con(a);//左孩子 cin>>a; if(a=="*") tree1[i].Rchild1=-1; else tree1[i].Rchild1=con(a);//右孩子 tree1[i].num=i;//标记好房间号 }//建立二叉树 for(int i=0;i<=n;i++) { flag[tree1[i].Lchild1]=true; flag[tree1[i].Rchild1]=true; } for(int i=0;i<=n;i++) { if(flag[i]==0) root1=i; }//找树根,标记所有节点的子节点,没有被标记的唯一点即为树根 qu.push(tree1[root1]);//树根存入队列 while(!qu.empty()) { le=qu.front(); qu.pop(); if(le.Lchild1==-1&&le.Rchild1==-1) { printf("%d",le.num);//cout<<le.num; }//无子节点就输出 if(le.Lchild1!=-1) { qu.push(tree1[le.Lchild1]); } if(le.Rchild1!=-1) { qu.push(tree1[le.Rchild1]); }//有子节点优先在队尾存入左孩子,然后存入右孩子 } return 0; }
(觉得写得不错就给个小小的赞吧)