uva712 -- S-Trees
阿新 • • 發佈:2019-02-02
這題在看題的時候我認為要建立二叉樹,在寫的時候發現不需要建樹,只需要根據二叉樹的一個性質:對於編號為k的結點(k從0開始計數),其左子結點的編號為2*k+1,右子結點的編號為2*k+2,題目中已經告訴我們vva序列中取0的時候往左走,取1的時候往右走,葉子結點的序列也給出了,所以我們從根節點根據vva序列往下走,走到葉子結點,得到葉子結點的編號,然後求出此葉子結點是第幾個葉子結點,在所給的葉子結點序列裡輸出對應的葉子結點就行了。有一點需要注意:二叉樹的層編號不一定是從1開始的,比如測試用例給出的x3,x1,x2就不是從1開始的,而輸入的vva序列的編號一定是從1開始的,所以我們要對輸入的vva進行轉化,使vva中的資料以層編號為序排列。具體程式碼如下:
#include <iostream> #include <cstring> #include <cstdio> #include <string> using namespace std; int n,m; int level[10]; //記錄層編號 string leaf; //葉子結點序列 int nonLeaves; //非葉子結點的個數 char solve(string str) { int k=0; for(int i=0;i<str.length();i++) k=(str[i]=='0'?(2*k+1):(2*k+2)); return leaf[k-nonLeaves]; } int main() { //freopen("test.txt","r",stdin); int no=0; while(cin>>n&&n) { printf("S-Tree #%d:\n",++no); memset(level,0,sizeof(level)); nonLeaves=(1<<n)-1; for(int i=0;i<n;i++) //輸入層編號,去掉前面的x { string str; cin>>str; level[i]=str[1]-'0'; } cin>>leaf; int m; cin>>m; string result=""; while(m--) { string vva; cin>>vva; string trans=vva; for(int i=0;i<vva.length();i++) //對vva進行轉換 trans[i]=vva[level[i]-1]; char ans=solve(trans); result+=ans; } cout<<result<<endl<<endl; } return 0; }