- 题意:现在给你一个有n个数字的堆,然后询问你从根节点到每个叶子结点的路径,以及这个堆是个什么样子的堆。
- 思路:给出的次序是按照层次给的, 直接根据这个顺序进行dfs 先又后左递归输出路径即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 456 int n,t,a[maxn],flag,id; bool ok; int stk[maxn]; vector<int>ans[111]; void dfs(int cnt,int ide) { if(cnt>n) { id++; for(int i=0; i<ide; i++) { ans[id].push_back(stk[i]); if(i>0&&stk[i]<stk[i-1]&&flag==1)ok=1; if(i>0&&stk[i]>stk[i-1]&&flag==2)ok=1; } return ; } stk[ide]=a[cnt]; if(cnt*2+1<=n) dfs(cnt*2+1,ide+1); dfs(cnt*2,ide+1); } int main() { scanf("%d",&t); while(t--) { for(int i=1; i<=id; i++) ans[i].clear(); id=ok=0; scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); if(a[2]>a[1])flag=1; else flag=2; dfs(1,0); if(ok) { for(int i=1; i<=id; i++) for(int j=0; j<ans[i].size(); j++) if(ans[i].size()-1==j) printf("%d\n",ans[i][j]); else printf("%d ",ans[i][j]); printf("NOT HEAP\n"); } else if(flag==1) { for(int i=1; i<=id; i++) for(int j=0; j<ans[i].size(); j++) if(ans[i].size()-1==j) printf("%d\n",ans[i][j]); else printf("%d ",ans[i][j]); printf("MIN HEAP\n"); } else if(flag==2) { for(int i=1; i<=id; i++) for(int j=0; j<ans[i].size(); j++) if(ans[i].size()-1==j) printf("%d\n",ans[i][j]); else printf("%d ",ans[i][j]); printf("MAX HEAP\n"); } } return 0; }
SDUT-小F的PAT-dfs路径记录
最新推荐文章于 2024-06-26 16:58:50 发布